跳到主要內容

發表文章

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 在操作中間插入 多個變數的一致性

TOOMOSS韌體更新在C糟被擋,要改到D糟

  TOOMOSS 路徑名稱不能使用中文,所以放在中文名稱下的firmware無法更新.

VScode跳轉問題 II

  1.確認Json檔中的路徑. 2.確認Json檔中設定  "C_Cpp.intelliSenseEngine" : "default" Disabl改成default

VScode CTRL+click跳轉問題

  這通常是 VS Code 的 設定衝突 或 滑鼠游標焦點 問題造成的。請依照下列步驟排查,通常第一個方法就能解決: 1. 關閉「多重游標修飾鍵」設定 如果設定衝突,VS Code 會等待你的第二次點擊。 按下 Ctrl + , 開啟設定。 在搜尋欄輸入: multiCursorModifier 將設定從 ctrlCmd 改回 alt 。 2. 檢查連點設定 (Selection) 在設定中搜尋: editor.multiCursorModifier 確保它 沒有 被勾選或設為與 Ctrl 衝突的組合。 3. 停用衝突的擴充功能 (Extensions) 某些提供代碼跳轉、Git 歷史或 Vim 鍵盤映射的套件會攔截點擊事件。 按下 Ctrl + Shift + X 開啟擴充功能。 嘗試停用最近安裝或與「滑鼠/導覽」相關的套件(例如 Vim , GitLens , Sublime Keybindings )。 重新啟動 VS Code 測試。 4. 重設游標跟隨定義 在設定中搜尋: editor.gotoLocation.multiple 將其設定改為 peek 或 goto ,避免跳出選單需要二次點擊。

MCC LIN TX 一些隱藏的小問題

  這2個函數有可能在多個地方被重複呼叫,主要是在中斷時用到 .mcc_generated_files/LINDrivers/lin_master.c:230:: advisory: (1510) non-reentrant function "_LIN_getChecksum" appears in multiple call graphs and has been duplicated by the compiler mcc_generated_files/LINDrivers/lin_master.c:270:: advisory: (1510) non-reentrant function "_LIN_stopTimer" appears in multiple call graphs and has been duplicated by the compiler 解法:其中一個不呼叫直接放內容或呼叫改名例如LIN_stopTimer_init() 避免重覆設定 開始計時也要將計數器歸零(同接收問題)LIN_timerCallBack=0 這2個函數有可能在多個地方被重複呼叫(但不會同時使用,暫時先不修正) C:\Program Files\Microchip\xc8\v3.10\pic\sources\c99\common\memcpy.c:4:: advisory: (1510) non-reentrant function "_memcpy" appears in multiple call graphs and has been duplicated by the compiler C:\Program Files\Microchip\xc8\v3.10\pic\sources\c99\common\memset.c:3:: advisory: (1510) non-reentrant function "_memset" appears in multiple call graphs and has been duplicated by the compiler               要傳送的資料要放進SW_STATE_Date[]