記憶
我今天突然想起來,以前經常使用的一個源碼下載網站,背景是白色的,界面非常簡單的,就是想不起來叫什么了,好幾年沒見過了。然后就嘗試搜了搜一些關鍵詞比如opencv 源碼之類的,終于看到了pudn,就是這個,老帳號還能登錄,哈哈,就是界面變了。我又找回了記憶。
PCAN linux driver
linux安裝pcan驅動:
1. tar -xvf peak-linux-driver-8.8.0
2. cd peak-linux-driver-8.8.0
3. sudo make clean
4. sudo make
5. sudo make install
6. sudo modprobe pcan
7. cd driver/
8. sudo ./pcan_make_devices 2
9. ls -l /dev/pcan*
任務計數信號量 freertos
【任務計數信號量、任務二值信號量、任務事件標志組、任務消息郵箱】
任務計數信號量和計數信號量類似
優點:能提高任務切換速度,使用更少的RAM
缺點:只可以用在任務只有一個等待信號量的情況,不支持超時等待
信號量 freertos
【計數信號量】
FreeRTOS 中計數信號量的源碼實現是基于消息隊列實現的。
當管理多個共享資源的問題時,可以使用計數信號量。
【二值信號量】
二值信號量是計數信號量的一種特殊形式,即共享資源為 1 的情況。
【互斥信號量】
FreeRTOS 中互斥信號量的源碼實現是基于消息隊列實現的。
互斥信號量的主要作用是對資源實現互斥訪問,使用二值信號量也可以實現互斥訪問的功能,不過互斥信號量與二值信號量有區別。
互斥信號量可以防止優先級翻轉,而二值信號量不支持。
消息隊列 freertos
【消息隊列】
消息隊列就是通過 RTOS 內核提供的服務,任務或中斷服務子程序可以將一個消息(注意,FreeRTOS消息隊列傳遞的是實際數據,并不是數據地址,RTX,uCOS-II 和 uCOS-III 是傳遞的地址)放入到隊列。
同樣,一個或者多個任務可以通過 RTOS 內核服務從隊列中得到消息。通常,先進入消息隊列的消息先傳給任務,也就是說,任務先得到的是最先進入到消息隊列的消息,即先進先出的原則(FIFO),FreeRTOS的消息隊列支持 FIFO 和 LIFO 兩種數據存取方式。
軟件定時器組 freertos
【軟件定時器組】
FreeRTOS 軟件定時器組的時基是基于系統時鐘節拍實現的,之所以叫軟件定時器是因為它的實現不需要使用任何硬件定時器,而且可以創建很多個,綜合這些因素,這個功能就被稱之為軟件定時器組。
既然是定時器,那么它實現的功能與硬件定時器也是類似的。在硬件定時器中,我們是在定時器中斷中實現需要的功能,而使用軟件定時器時,我們是在創建軟件定時器時指定軟件定時器的回調函數,在回調函數中實現相應的功能。
軟件定時器回調函數--by blink
static void vTimerCallback(xTimerHandle pxTimer)
其中的參數是傳入的定時器句柄,可以從這個句柄中得到是哪個定時器ID,或者也可以直接比較之前創建的句柄來判定觸發了哪個軟件定時器。
事件標志組 freertos
【事件標志組】
事件標志組是實現多任務同步的有效機制之一。也許有不理解的初學者會問采用事件標志組多麻煩,搞個全局變量不是更簡單?其實不然,在裸機編程時,使用全局變量的確比較方便,但是在加上 RTOS 后就是另一種情況了。使用全局變量相比事件標志組主要有如下三個問題:
a. 使用事件標志組可以讓 RTOS 內核有效地管理任務,而全局變量是無法做到的,任務的超時等機制需要用戶自己去實現。
b. 使用了全局變量就要防止多任務的訪問沖突,而使用事件標志組則處理好了這個問題,用戶無需擔心。
c. 使用事件標志組可以有效地解決中斷服務程序和任務之間的同步問題。
【什么時候使用事件標志組】
中斷服務程序和任務之間的需要同步的時候。
任務之間需要通信或者同步的時候。
任務鎖 中斷鎖 調度鎖 freertos
【調度鎖】
調度鎖就是 RTOS 提供的調度器開關函數,如果某個任務調用了調度鎖開關函數,處于調度鎖開和調度鎖關之間的代碼在執行期間是不會被高優先級的任務搶占的,即任務調度被禁止。這一點要跟臨界段的作用區分開,調度鎖只是禁止了任務調度,并沒有關閉任何中斷,中斷還是正常執行的。而臨界段進行了開關中斷操作。
【中斷鎖】
中斷鎖就是 RTOS 提供的開關中斷函數,FreeRTOS 沒有專門的中斷鎖函數,使用 FreeRTOS的中斷服務程序臨界段處理函數就可以實現同樣效果。
【任務鎖】
簡單的說,為了防止當前任務的執行被其它高優先級的任務打斷而提供的鎖機制就是任務鎖。
FreeRTOS 也沒有專門的任務鎖函數,但是使用 FreeRTOS 現有的功能有兩種實現方法:
a. 通過給調度器加鎖實現
利用 FreeRTOS 的調度鎖功能給調度器加鎖的話,將關閉任務切換功能,從而高優先級任務也就無法
搶占低優先級任務的執行,同時高優先級任務也是無法向低優先級任務切換的。另外特別注意,調度
鎖只是禁止了調度器工作,并沒有關閉任何中斷。
b. 通過關閉任務切換中斷 PendSV 和系統時鐘節拍中斷 Systick
利用 FreeRTOS 的任務代碼臨界段處理函數就可以關閉 PendSV 中斷和 Systick 中斷。因為進入臨界
段前,操作寄存器 basepri 關閉了所有小于等于宏定義configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 所定義的中斷優先級(實現任務切換功能的 PendSV 中斷和滴答定時器中斷是最低優先級中斷,所以也是被關閉的),這樣低優先級任務在執行臨界段代碼期間是不會被高優先級任務打斷的,從而就實現了任務鎖的效果。
臨界區處理 freertos
FreeRTOS 源碼中就有多處臨界段的處理,跟 FreeRTOS 一樣,uCOS-II 和 uCOS-III 源碼中都是有臨界段的,而 RTX 的源碼中不存在臨界段。另外,除了 FreeRTOS 操作系統源碼所帶的臨界段以外,用戶寫應用的時候也有臨界段的問題,比如以下兩種:
* 讀取或者修改變量(特別是用于任務間通信的全局變量)的代碼,一般來說這是最常見的臨界代碼。
* 調用公共函數的代碼,特別是不可重入的函數,如果多個任務都訪問這個函數,結果是可想而知的。
總之,對于臨界段要做到執行時間越短越好,否則會影響系統的實時性。