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?