跳到主要內容

發表文章

目前顯示的是 10月, 2026的文章

typedef 和 enum 使用技巧

第2種方式可以明確的知道lin_cmd_t是uint8_t 佔用一個byte,第一種方式在不同的編譯器可能會變成2個byte. 第1種方式 typedef enum {     SIGNAL = 0x01 }lin_cmd_t; 和 第2種方式 typedef uint8_t lin_cmd_t; enum {      SIGNAL = 0x01 }; const lin_rx_cmd_t scheduleTable[] = {     //Command, Type, TX/RX Length, Data Address     {SIGNAL, RECEIVE, 8U, SIGNAL_Data } };

MCC LIN TX 小問題2

新增 found flag,找不到就返回,原本找不到會提供最後一個值。  void LIN_queuePacket(uint8_t cmd) {   bool found = false;   const lin_rx_cmd_t *tempSchedule =       LIN_rxCommand; // copy table pointer so we can modify it   cmd &= 0x3F; // clear possible parity bits   for (uint8_t i = 0U; i < LIN_rxCommandLength; i++) {     if (cmd == tempSchedule->cmd) {       found = true;       break;     }     tempSchedule++; // go to next entry   }   // 找不到就返回   if (found == false) {     return;   }   LIN_packet.type = tempSchedule->type;   LIN_packet.length = tempSchedule->length;   // Build Packet - User defined data   // add data   memcpy(LIN_packet.data, tempSchedule->data, LIN_packet.length);   // Add Checksum   LIN_packet.checksum =       LIN_getChecksum(LIN_packet.length, LIN_packet.PID, LIN_packet.data);   LIN_sendP...

ISR/主程式共享變數情況需設定成volatile

  ISR/主程式共享變數情況需設定成volatile,計時器一定要設成volatile. 原因如下: 編譯器不一定知道 ISR 會在任意時間修改它,因此可能將值暫存在 CPU 暫存器。 所以在其它地方還是讀取變數,而ISR的修改卻存在CPU暫存器沒存回變數, 會因此造成錯誤。(編譯器不最佳化可能不會出問題,但最佳化後可能會出問題) 因為使用免費的編譯器沒有最佳化功能所以不會有問題 >"< volatile 不代表執行緒安全 volatile 只保證編譯器不要省略或快取存取,不提供: 原子操作保證 互斥鎖 防止 ISR 在操作中間插入 多個變數的一致性