C in ModusToolBox (MTB)

1. FreeRTOS: Real-Time Operating System

1.1 RTOS ΰΈ„ΰΈ·ΰΈ­ΰΈ­ΰΈ°ΰΉ„ΰΈ£?

WHY: ΰΈ—ΰΈ³ΰΉ„ΰΈ‘ΰΈ•ΰΉ‰ΰΈ­ΰΈ‡ΰΈ£ΰΈΉΰΉ‰?

  • ปัญหา: ΰΉ‚ΰΈ›ΰΈ£ΰΉΰΈΰΈ£ΰΈ‘ΰΉΰΈšΰΈš bare-metal (while loop ΰΉ€ΰΈ”ΰΈ΅ΰΈ’ΰΈ§) ΰΈˆΰΈ±ΰΈ”ΰΈΰΈ²ΰΈ£ΰΈ«ΰΈ₯ΰΈ²ΰΈ’ΰΈ‡ΰΈ²ΰΈ™ΰΈžΰΈ£ΰΉ‰ΰΈ­ΰΈ‘ΰΈΰΈ±ΰΈ™ΰΈ’ΰΈ²ΰΈ

  • ΰΈ›ΰΈ£ΰΈ°ΰΉ‚ΰΈ’ΰΈŠΰΈ™ΰΉŒ: ΰΉΰΈšΰΉˆΰΈ‡ΰΈ‡ΰΈ²ΰΈ™ΰΉ€ΰΈ›ΰΉ‡ΰΈ™ Tasks, ΰΈˆΰΈ±ΰΈ”ΰΈΰΈ²ΰΈ£ timing, ΰΉƒΰΈŠΰΉ‰ resources ΰΈ£ΰΉˆΰΈ§ΰΈ‘ΰΈΰΈ±ΰΈ™ΰΉ„ΰΈ”ΰΉ‰

  • Hardware: MCU ΰΈ’ΰΈΈΰΈ„ΰΉƒΰΈ«ΰΈ‘ΰΉˆΰΈ‘ΰΈ΅ RAM ΰΉ€ΰΈžΰΈ΅ΰΈ’ΰΈ‡ΰΈžΰΈ­ΰΈͺำหรับ RTOS overhead

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                      Bare-metal                             β”‚
β”‚  while(1) {                                                 β”‚
β”‚      read_sensor();    // ถ้านานเกินไป...                     β”‚
β”‚      process_data();   // ...ΰΈ‡ΰΈ²ΰΈ™ΰΈ­ΰΈ·ΰΉˆΰΈ™ΰΈ•ΰΉ‰ΰΈ­ΰΈ‡ΰΈ£ΰΈ­                     β”‚
β”‚      send_to_cloud();  // blocking!                         β”‚
β”‚  }                                                          β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                       FreeRTOS                              β”‚
β”‚  Task 1: read_sensor()      ─┐                              β”‚
β”‚  Task 2: process_data()      β”œβ”€β†’ ΰΈ—ΰΈ³ΰΈ‡ΰΈ²ΰΈ™ΰΈžΰΈ£ΰΉ‰ΰΈ­ΰΈ‘ΰΈΰΈ±ΰΈ™!               β”‚
β”‚  Task 3: send_to_cloud()    β”€β”˜   (time-slicing)             β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

1.2 FreeRTOS Configuration

จาก FreeRTOSConfig.h:

HOW: ΰΈ›ΰΈ£ΰΈ°ΰΈ’ΰΈΈΰΈΰΈ•ΰΉŒΰΉƒΰΈŠΰΉ‰ΰΈˆΰΈ£ΰΈ΄ΰΈ‡ΰΉƒΰΈ™ΰΈ­ΰΈΈΰΈ•ΰΈͺาหกรรฑ

  • Smart Watch: Task แฒก: UI, Heart Rate, Step Counter, BLE

  • Industrial PLC: Task แฒก: I/O Scan, Communication, Control Loop

  • IoT Gateway: Task แฒก: Sensor Reading, Data Processing, Cloud Upload

CAUTION: ΰΈ‚ΰΉ‰ΰΈ­ΰΈ„ΰΈ§ΰΈ£ΰΈ£ΰΈ°ΰΈ§ΰΈ±ΰΈ‡

ΰΈ‚ΰΉ‰ΰΈ­ΰΈœΰΈ΄ΰΈ”ΰΈžΰΈ₯ΰΈ²ΰΈ”
ผΰΈ₯ΰΈΰΈ£ΰΈ°ΰΈ—ΰΈš
ΰΈ§ΰΈ΄ΰΈ˜ΰΈ΅ΰΈ›ΰΉ‰ΰΈ­ΰΈ‡ΰΈΰΈ±ΰΈ™

Stack size น้อฒเกินไป

Stack overflow, Hard fault

ΰΉƒΰΈŠΰΉ‰ uxTaskGetStackHighWaterMark()

Heap ΰΉ€ΰΈ•ΰΉ‡ΰΈ‘

Task create fail

Monitor heap usage

Priority inversion

High priority task ถูก block

ΰΉƒΰΈŠΰΉ‰ mutex with priority inheritance

1.3 การΰΈͺΰΈ£ΰΉ‰ΰΈ²ΰΈ‡ Task

WHY: ΰΈ—ΰΈ³ΰΉ„ΰΈ‘ΰΈ•ΰΉ‰ΰΈ­ΰΈ‡ΰΈ£ΰΈΉΰΉ‰?

  • ปัญหา: ΰΈ‡ΰΈ²ΰΈ™ periodic (ΰΉ€ΰΈŠΰΉˆΰΈ™ ΰΈ­ΰΉˆΰΈ²ΰΈ™ sensor ทุก 100ms) ΰΈ•ΰΉ‰ΰΈ­ΰΈ‡ΰΈˆΰΈ±ΰΈ”ΰΈΰΈ²ΰΈ£ timing

  • ΰΈ›ΰΈ£ΰΈ°ΰΉ‚ΰΈ’ΰΈŠΰΈ™ΰΉŒ: RTOS ΰΈˆΰΈ±ΰΈ”ΰΈΰΈ²ΰΈ£ scheduling ΰΉƒΰΈ«ΰΉ‰, ΰΉ‚ΰΈ„ΰΉ‰ΰΈ”ΰΈ­ΰΉˆΰΈ²ΰΈ™ΰΈ‡ΰΉˆΰΈ²ΰΈ’

  • Hardware: Kernel ΰΉƒΰΈŠΰΉ‰ SysTick timer ΰΈˆΰΈ±ΰΈ”ΰΈΰΈ²ΰΈ£ context switching

ΰΈ•ΰΈ±ΰΈ§ΰΈ­ΰΈ’ΰΉˆΰΈ²ΰΈ‡ΰΉ‚ΰΈ„ΰΉ‰ΰΈ”

Header file (sensor_hub_daq_task.h):

Task function:

Task creation:

HOW: ΰΈ›ΰΈ£ΰΈ°ΰΈ’ΰΈΈΰΈΰΈ•ΰΉŒΰΉƒΰΈŠΰΉ‰ΰΈˆΰΈ£ΰΈ΄ΰΈ‡ΰΉƒΰΈ™ΰΈ­ΰΈΈΰΈ•ΰΈͺาหกรรฑ

  • Sensor Data Acquisition: ΰΈ­ΰΉˆΰΈ²ΰΈ™ΰΈ„ΰΉˆΰΈ²ΰΈ—ΰΈΈΰΈ 10-100ms

  • Motor Control: PID loop ทุก 1ms

  • Communication: Check incoming data ทุก 50ms

CAUTION: ΰΈ‚ΰΉ‰ΰΈ­ΰΈ„ΰΈ§ΰΈ£ΰΈ£ΰΈ°ΰΈ§ΰΈ±ΰΈ‡

ΰΈ‚ΰΉ‰ΰΈ­ΰΈœΰΈ΄ΰΈ”ΰΈžΰΈ₯ΰΈ²ΰΈ”
ผΰΈ₯ΰΈΰΈ£ΰΈ°ΰΈ—ΰΈš
ΰΈ§ΰΈ΄ΰΈ˜ΰΈ΅ΰΈ›ΰΉ‰ΰΈ­ΰΈ‡ΰΈΰΈ±ΰΈ™

ΰΉƒΰΈŠΰΉ‰ vTaskDelay แทน vTaskDelayUntil

Timing drift

ΰΉƒΰΈŠΰΉ‰ vTaskDelayUntil ΰΈͺำหรับ periodic

Task ΰΉ„ΰΈ‘ΰΉˆΰΈ‘ΰΈ΅ delay

CPU 100%, task ΰΈ­ΰΈ·ΰΉˆΰΈ™ΰΉ„ΰΈ‘ΰΉˆΰΈ—ΰΈ³ΰΈ‡ΰΈ²ΰΈ™

ΰΈ•ΰΉ‰ΰΈ­ΰΈ‡ΰΈ‘ΰΈ΅ delay ΰΈ«ΰΈ£ΰΈ·ΰΈ­ yield

Stack overflow

Crash, Data corruption

ΰΈ•ΰΈ£ΰΈ§ΰΈˆΰΈͺอบ high watermark

1.4 vTaskDelay vs vTaskDelayUntil


2. I2C Communication

2.1 I2C ΰΈ„ΰΈ·ΰΈ­ΰΈ­ΰΈ°ΰΉ„ΰΈ£?

WHY: ΰΈ—ΰΈ³ΰΉ„ΰΈ‘ΰΈ•ΰΉ‰ΰΈ­ΰΈ‡ΰΈ£ΰΈΉΰΉ‰?

  • ปัญหา: ΰΈ•ΰΉ‰ΰΈ­ΰΈ‡ΰΉ€ΰΈŠΰΈ·ΰΉˆΰΈ­ΰΈ‘ΰΈ•ΰΉˆΰΈ­ΰΈΰΈ±ΰΈš sensor/peripheral ΰΈ ΰΈ²ΰΈ’ΰΈ™ΰΈ­ΰΈΰΈ—ΰΈ΅ΰΉˆΰΈ‘ΰΈ΅ protocol ΰΈ‹ΰΈ±ΰΈšΰΈ‹ΰΉ‰ΰΈ­ΰΈ™

  • ΰΈ›ΰΈ£ΰΈ°ΰΉ‚ΰΈ’ΰΈŠΰΈ™ΰΉŒ: ΰΉƒΰΈŠΰΉ‰ΰΈͺΰΈ²ΰΈ’ΰΉΰΈ„ΰΉˆ 2 ΰΉ€ΰΈͺΰΉ‰ΰΈ™ (SDA, SCL), ΰΉ€ΰΈŠΰΈ·ΰΉˆΰΈ­ΰΈ‘ΰΈ•ΰΉˆΰΈ­ΰΈ«ΰΈ₯ΰΈ²ΰΈ’ device ΰΉ„ΰΈ”ΰΉ‰

  • Hardware: Sensor ΰΈͺΰΉˆΰΈ§ΰΈ™ΰΉƒΰΈ«ΰΈΰΉˆΰΈ£ΰΈ­ΰΈ‡ΰΈ£ΰΈ±ΰΈš I2C (ΰΉ€ΰΈŠΰΉˆΰΈ™ IMU, Temperature, Display)

2.2 I2C Initialization

ΰΈ•ΰΈ±ΰΈ§ΰΈ­ΰΈ’ΰΉˆΰΈ²ΰΈ‡ΰΉ‚ΰΈ„ΰΉ‰ΰΈ”

HOW: ΰΈ›ΰΈ£ΰΈ°ΰΈ’ΰΈΈΰΈΰΈ•ΰΉŒΰΉƒΰΈŠΰΉ‰ΰΈˆΰΈ£ΰΈ΄ΰΈ‡ΰΉƒΰΈ™ΰΈ­ΰΈΈΰΈ•ΰΈͺาหกรรฑ

  • Smart Watch: I2C bus ΰΉ€ΰΈŠΰΈ·ΰΉˆΰΈ­ΰΈ‘ IMU, Heart Rate, Touch Controller

  • Weather Station: I2C ΰΉ€ΰΈŠΰΈ·ΰΉˆΰΈ­ΰΈ‘ Temperature, Humidity, Pressure sensors

  • OLED Display: SSD1306 display ΰΉƒΰΈŠΰΉ‰ I2C

CAUTION: ΰΈ‚ΰΉ‰ΰΈ­ΰΈ„ΰΈ§ΰΈ£ΰΈ£ΰΈ°ΰΈ§ΰΈ±ΰΈ‡

ΰΈ‚ΰΉ‰ΰΈ­ΰΈœΰΈ΄ΰΈ”ΰΈžΰΈ₯ΰΈ²ΰΈ”
ผΰΈ₯ΰΈΰΈ£ΰΈ°ΰΈ—ΰΈš
ΰΈ§ΰΈ΄ΰΈ˜ΰΈ΅ΰΈ›ΰΉ‰ΰΈ­ΰΈ‡ΰΈΰΈ±ΰΈ™

ΰΉ„ΰΈ‘ΰΉˆΰΈ‘ΰΈ΅ Pull-up resistor

Communication fail

ΰΉƒΰΈŠΰΉ‰ external 4.7kΞ© pull-up

Address conflict

Device ΰΈŠΰΈ™ΰΈΰΈ±ΰΈ™

ΰΈ•ΰΈ£ΰΈ§ΰΈˆΰΈͺอบ address ΰΉΰΈ•ΰΉˆΰΈ₯ΰΈ° device

Clock speed ΰΉ„ΰΈ‘ΰΉˆΰΈ•ΰΈ£ΰΈ‡

Data corruption

ΰΉƒΰΈŠΰΉ‰ speed ΰΈ—ΰΈ΅ΰΉˆΰΈ—ΰΈΈΰΈ device ΰΈ£ΰΈ­ΰΈ‡ΰΈ£ΰΈ±ΰΈš

Bus stuck (SDA low)

I2C ΰΈ«ΰΈ’ΰΈΈΰΈ”ΰΈ—ΰΈ³ΰΈ‡ΰΈ²ΰΈ™

Implement bus recovery


3. BMI270 IMU Sensor Integration

3.1 BMI270 ΰΈ„ΰΈ·ΰΈ­ΰΈ­ΰΈ°ΰΉ„ΰΈ£?

BMI270 = 6-axis Inertial Measurement Unit (IMU) จาก Bosch

  • Accelerometer: ΰΈ§ΰΈ±ΰΈ”ΰΈ„ΰΈ§ΰΈ²ΰΈ‘ΰΉ€ΰΈ£ΰΉˆΰΈ‡ 3 แกน (X, Y, Z) ΰΈ«ΰΈ™ΰΉˆΰΈ§ΰΈ’ g ΰΈ«ΰΈ£ΰΈ·ΰΈ­ m/sΒ²

  • Gyroscope: ΰΈ§ΰΈ±ΰΈ”ΰΈ„ΰΈ§ΰΈ²ΰΈ‘ΰΉ€ΰΈ£ΰΉ‡ΰΈ§ΰΉ€ΰΈŠΰΈ΄ΰΈ‡ΰΈ‘ΰΈΈΰΈ‘ 3 แกน ΰΈ«ΰΈ™ΰΉˆΰΈ§ΰΈ’ Β°/s ΰΈ«ΰΈ£ΰΈ·ΰΈ­ rad/s

3.2 Sensor Initialization

ΰΈ•ΰΈ±ΰΈ§ΰΈ­ΰΈ’ΰΉˆΰΈ²ΰΈ‡ΰΉ‚ΰΈ„ΰΉ‰ΰΈ”

3.3 Reading Sensor Data

HOW: ΰΈ›ΰΈ£ΰΈ°ΰΈ’ΰΈΈΰΈΰΈ•ΰΉŒΰΉƒΰΈŠΰΉ‰ΰΈˆΰΈ£ΰΈ΄ΰΈ‡ΰΉƒΰΈ™ΰΈ­ΰΈΈΰΈ•ΰΈͺาหกรรฑ

  • Fitness Tracker: ΰΈ™ΰΈ±ΰΈšΰΈΰΉ‰ΰΈ²ΰΈ§, ΰΈ•ΰΈ£ΰΈ§ΰΈˆΰΈˆΰΈ±ΰΈšΰΈΰΈ΄ΰΈˆΰΈΰΈ£ΰΈ£ΰΈ‘ (ΰΈ§ΰΈ΄ΰΉˆΰΈ‡, ΰΈ§ΰΉˆΰΈ²ΰΈ’ΰΈ™ΰΉ‰ΰΈ³)

  • Drone: ΰΈ„ΰΈ§ΰΈšΰΈ„ΰΈΈΰΈ‘ stability แΰΈ₯ΰΈ° orientation

  • Gaming Controller: ΰΈ•ΰΈ£ΰΈ§ΰΈˆΰΈˆΰΈ±ΰΈšΰΈΰΈ²ΰΈ£ΰΉ€ΰΈ„ΰΈ₯ΰΈ·ΰΉˆΰΈ­ΰΈ™ΰΉ„ΰΈ«ΰΈ§ΰΈ‘ΰΈ·ΰΈ­

  • Industrial: ΰΈ•ΰΈ£ΰΈ§ΰΈˆΰΈˆΰΈ±ΰΈš vibration ΰΉ€ΰΈžΰΈ·ΰΉˆΰΈ­ predictive maintenance

CAUTION: ΰΈ‚ΰΉ‰ΰΈ­ΰΈ„ΰΈ§ΰΈ£ΰΈ£ΰΈ°ΰΈ§ΰΈ±ΰΈ‡

ΰΈ‚ΰΉ‰ΰΈ­ΰΈœΰΈ΄ΰΈ”ΰΈžΰΈ₯ΰΈ²ΰΈ”
ผΰΈ₯ΰΈΰΈ£ΰΈ°ΰΈ—ΰΈš
ΰΈ§ΰΈ΄ΰΈ˜ΰΈ΅ΰΈ›ΰΉ‰ΰΈ­ΰΈ‡ΰΈΰΈ±ΰΈ™

ΰΉ„ΰΈ‘ΰΉˆ calibrate sensor

ΰΈ„ΰΉˆΰΈ² offset ΰΈœΰΈ΄ΰΈ”

Calibrate ΰΈΰΉˆΰΈ­ΰΈ™ΰΉƒΰΈŠΰΉ‰ΰΈ‡ΰΈ²ΰΈ™

ΰΈ­ΰΉˆΰΈ²ΰΈ™ΰΈ„ΰΉˆΰΈ²ΰΈ–ΰΈ΅ΰΉˆΰΉ€ΰΈΰΈ΄ΰΈ™ΰΉ„ΰΈ›

ΰΉ„ΰΈ”ΰΉ‰ΰΈ„ΰΉˆΰΈ²ΰΈ‹ΰΉ‰ΰΈ³

ΰΉƒΰΈŠΰΉ‰ Data Ready interrupt

Range ΰΉ„ΰΈ‘ΰΉˆΰΉ€ΰΈ«ΰΈ‘ΰΈ²ΰΈ°ΰΈͺΰΈ‘

Clipping ΰΈ«ΰΈ£ΰΈ·ΰΈ­ Resolution ΰΈ•ΰΉˆΰΈ³

ΰΉ€ΰΈ₯ือก range ΰΈ•ΰΈ²ΰΈ‘ application

4. Math Operations ΰΈͺำหรับ Sensor Data

4.1 การแปΰΈ₯ΰΈ‡ΰΈ«ΰΈ™ΰΉˆΰΈ§ΰΈ’ (Unit Conversion)

4.2 Vector Magnitude

4.3 Absolute Value


5. Enum - State Machines

5.1 Enum Basics

5.2 Enum ΰΈͺำหรับ Orientation


6. Memory Management

6.1 memset - ΰΈ₯ΰΉ‰ΰΈ²ΰΈ‡ΰΈ‚ΰΉ‰ΰΈ­ΰΈ‘ΰΈΉΰΈ₯

6.2 memcpy - Copy ΰΈ‚ΰΉ‰ΰΈ­ΰΈ‘ΰΈΉΰΈ₯

6.3 sizeof - ΰΈ‚ΰΈ™ΰΈ²ΰΈ”ΰΈ‚ΰΈ­ΰΈ‡ Type/Variable


ΰΈͺΰΈ£ΰΈΈΰΈ›ΰΈ­ΰΈ‡ΰΈ„ΰΉŒΰΈ„ΰΈ§ΰΈ²ΰΈ‘ΰΈ£ΰΈΉΰΉ‰ΰΈͺำคัญ

API Functions ΰΈ—ΰΈ΅ΰΉˆΰΉƒΰΈŠΰΉ‰ΰΈšΰΉˆΰΈ­ΰΈ’

ΰΈ›ΰΈ£ΰΈ°ΰΉ€ΰΈ ΰΈ—
Function
ΰΈ„ΰΈ³ΰΈ­ΰΈ˜ΰΈ΄ΰΈšΰΈ²ΰΈ’

RTOS

xTaskCreate()

ΰΈͺΰΈ£ΰΉ‰ΰΈ²ΰΈ‡ Task

vTaskDelayUntil()

Delay แบบ precise

xTaskGetTickCount()

ΰΈ­ΰΉˆΰΈ²ΰΈ™ΰΈ„ΰΉˆΰΈ² tick ΰΈ›ΰΈ±ΰΈˆΰΈˆΰΈΈΰΈšΰΈ±ΰΈ™

vTaskStartScheduler()

ΰΉ€ΰΈ£ΰΈ΄ΰΉˆΰΈ‘ RTOS

I2C

Cy_SCB_I2C_Init()

Initialize I2C

mtb_hal_i2c_setup()

Setup HAL

BMI270

mtb_bmi270_init_i2c()

Initialize sensor

mtb_bmi270_config_default()

Configure sensor

mtb_bmi270_read()

ΰΈ­ΰΉˆΰΈ²ΰΈ™ΰΈ„ΰΉˆΰΈ²

Quick Reference

Struct

Pointer

Array

Math

Memory

Enum


Last updated

Was this helpful?