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 ที่ใช้บ่อย
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?