MSP432P401R TI Drivers 库函数学习笔记(二)认识TI-RTOS (TI-POSIX)
目錄
- 簡介
- TI-RTOS
- FreeRTOS
- POSIX
- 運行時對象查看器 (Runtime Object Viewer)
- TI-POSIX 介紹
- 在源代碼中使用 POSIX
- TI-POSIX支持的函數(shù)摘要
- 線程函數(shù)調(diào)用的前后關(guān)系
- 線程管理
- 線程屬性
- 線程同步
- 障礙屬性
- 條件變量
- 條件變量屬性
- 互斥鎖
- 互斥屬性
- 讀寫鎖定
- 讀寫鎖屬性
- 輔助函數(shù)調(diào)用的前后關(guān)系
- 時鐘
- 消息隊列
- 信號量
- 睡眠
- 計時器
- 注意事項
- 線程默認(rèn)堆棧大小和線程默認(rèn)優(yōu)先級
- 線程調(diào)度策略
- FreeRTOS上的TI-POSIX
- 二進(jìn)制信號量
平臺:Code Composer Studio 10.4.0
MSP432P401R SimpleLink? 微控制器 LaunchPad? 開發(fā)套件
(MSP-EXP432P401R)
本文內(nèi)容機翻自
SimpleLink? MCU SDKs: RTOS and POSIX 和 TI-POSIX User’s Guide
簡介
???????SimpleLinkTM 微控制器(MCU)平臺的軟件開發(fā)工具包(sdk)具有通用組件和特定于設(shè)備的中間件,加快了上市時間,并提供了有線和無線設(shè)備的 SimpleLink 整個 MCU 組合的統(tǒng)一開發(fā)經(jīng)驗。關(guān)于 SimpleLink SDK 的框圖,請參閱下圖。在本文中,我將更深入地探討 SimpleLink SDK 中包含的組件如何使您能夠使用實時操作系統(tǒng)(RTOS)創(chuàng)建確定的、高效的、可伸縮的應(yīng)用程序。
TI-RTOS
???????TI-RTOS SimpleLink SDK 集成了 TI-RTOS,一個功能齊全的實時操作系統(tǒng)。所有 TI SimpleLink sdk 都預(yù)先安裝了 TI-rtos 內(nèi)核,并且與 Portable Operating System Interface (POSIX)兼容。TI-RTOS 是一個您可以信任的健壯解決方案,已經(jīng)部署在各種 TI 嵌入式解決方案的數(shù)千個應(yīng)用程序中。內(nèi)核是開放源碼的(開源 BSD [ BSD ]許可證) ,與 TI 的硅組合同步開發(fā),以實現(xiàn)非常低的延遲,高效的代碼占用。TI-RTOS 幫助您優(yōu)化您的應(yīng)用程序的功耗,性能和代碼大小,以滿足您的獨特需求。具體地說,TI-RTOS 的電源管理功能使您能夠以最小的努力和直觀的應(yīng)用程序編程接口(api)為應(yīng)用程序?qū)崿F(xiàn)積極的功耗節(jié)省。
???????TI-RTOS 內(nèi)核的中心是調(diào)度程序,它確保最高優(yōu)先級的線程正在運行。這提供了確定性和快速的運算。TI-RTOS 支持四種不同類型的線程: 硬件中斷(Hwis)、軟件中斷(Swis)、任務(wù)和空閑,如下面的圖2所示。TI-RTOS 提供了幾種線程通信機制,如信號量、郵箱、隊列、門和事件。此外,TI-RTOS 包括系統(tǒng)級的計時服務(wù)和內(nèi)存管理器,以確保您的應(yīng)用程序盡可能高效和精簡。
FreeRTOS
???????開發(fā) SimpleLink SDK 是模塊化的,允許您在 ti-RTOS 之外使用可選的 RTOS 內(nèi)核。除了 TI-RTOS,MSP432? 和 Wi-Fi ? CC3220軟件開發(fā)包(sdk)還包括使用流行的 FreeRTOS 的能力。SimpleLink sdk 的模塊性使您可以輕松插入首選的操作系統(tǒng)/內(nèi)核,從而獲得最大的靈活性。
POSIX
???????POSIX The SimpleLink SDK 還提供了與 POSIX 兼容的 api。POSIX 是一個電氣和電子工程師協(xié)會(IEEE)的操作系統(tǒng)兼容性 API 行業(yè)標(biāo)準(zhǔn)。POSIX 層抽象了應(yīng)用程序使用的 RTOS 內(nèi)核功能。在典型的應(yīng)用程序中,POSIX 層只需要少于2KB 的代碼,因此可以重用示例和用戶應(yīng)用程序,并將其移植到不同的內(nèi)核。使用這個層是可選的,但是這意味著你可以使用任何你目前熟悉的或者將來想要移動到的操作系統(tǒng)。POSIX 兼容性還允許 TI 第三方合作伙伴與 SimpleLink SDK 設(shè)備進(jìn)行接口,以增加對其內(nèi)核的支持,從而為包括 FreeRTOS 在內(nèi)的任何操作系統(tǒng)的設(shè)計提供完全自由。
運行時對象查看器 (Runtime Object Viewer)
???????運行時對象查看器為了幫助您優(yōu)化啟用 rtos 的應(yīng)用程序,TI 提供了強大的工具來幫助您調(diào)試和監(jiān)視代碼。具體來說,Runtime Object Viewer (ROV2)提供了一個強大的可視化和檢測界面,可以幫助您監(jiān)視線程狀態(tài)、堆使用情況和中央處理器(CPU)負(fù)載。下面的圖3顯示了一些可用的儀表板,以幫助您進(jìn)行調(diào)試。盡管 ROV2可以為您支持 RTOS 的應(yīng)用程序提供有用的洞察力,但 ROV2工具具有足夠的靈活性,可以在應(yīng)用程序中顯示與任何庫、 RTOS 或其他相關(guān)的高級信息。
TI-POSIX 介紹
在源代碼中使用 POSIX
在源代碼中使用 Open Group Specification 定義的文件名包含 POSIX 頭文件。例如,使用以下命令創(chuàng)建一個 POSIX 線程:
#include <pthread.h>void *start_fxn(void *arg); pthread_t thread; int arg = 1;pthread_create(&thread, NULL, start_fxn, (void *)&arg);在 SYS/BIOS 的以前版本中,POSIX 頭文件使用包限定的路徑名包含在內(nèi)。這已經(jīng)不再受支持了。不要使用下列包括語句:
#include <ti/sysbios/posix/pthread.h> INCORRECT #include <ti/sysbios/posix/sys/types.h> INCORRECT使用以下包括語句:
#include <pthread.h> #include <sys/types.h>TI-POSIX支持的函數(shù)摘要
在實時操作系統(tǒng)前后關(guān)系中,有三種前后關(guān)系:
main
在main()函數(shù)中,在調(diào)用RTOS調(diào)度器之前
task
在本地RTOS線程中(即不是從pthread中)
interrupt
在中斷服務(wù)程序中
線程函數(shù)調(diào)用的前后關(guān)系
線程管理
| pthread_cancel | 向線程發(fā)送取消請求 | No | Yes |
| pthread_cleanup_pop | 彈出線程取消清理處理程序 | No | Yes |
| pthread_cleanup_push | 推取消線程清理處理程序 | No | No |
| pthread_create | 創(chuàng)建一個新線程 | Yes | Yes |
| pthread_detach | 分離一個線程 | No | Yes |
| pthread_equal | 比較線程 id | Yes | Yes |
| pthread_exit | 終止調(diào)用線程 | No | No |
| pthread_getconcurrency | 不支持 | ||
| pthread_getcpuclockid | 不支持 | ||
| pthread_getschedparam | 用于獲取 pthread 的優(yōu)先級 | No | Yes |
| pthread_getspecific | 獲取調(diào)用線程的線程特定數(shù)據(jù) | No | No |
| pthread_join | 用終止線程連接 | No | Yes |
| pthread_key_create | 創(chuàng)建特定于線程的數(shù)據(jù)鍵 | No | No |
| pthread_key_delete | 刪除線程特定的數(shù)據(jù)鍵 | No | No |
| pthread_once | 運行一次初始化例程 | No | Yes |
| pthread_self | 獲取調(diào)用線程的 ID | No | No |
| pthread_setcancelstate | 設(shè)置取消能力狀態(tài)和類型 | No | No |
| pthread_setcanceltype | 不支持。只支持異步取消 | ||
| pthread_setconcurrency | 不支持 | ||
| pthread_setschedparam | 用于設(shè)置線程的優(yōu)先級 | No | No |
| pthread_setschedprio | 不支持。使用 pthread_setschedparam 來設(shè)置優(yōu)先級 | ||
| pthread_setspecific | 設(shè)置調(diào)用線程的線程特定數(shù)據(jù) | No | No |
| pthread_testcancel | 不支持 |
線程屬性
| pthread_attr_destroy | 銷毀線程屬性對象 | Yes | Yes |
| pthread_attr_getdetachstate | 獲取屬性對象中的分離狀態(tài) | Yes | Yes |
| pthread_attr_getguardsize | 獲取屬性對象中的保護(hù)大小 | Yes | Yes |
| pthread_attr_getinheritsched | 不支持的內(nèi)核調(diào)度策略是固定的 | ||
| pthread_attr_getschedparam | 獲取屬性對象中的調(diào)度參數(shù) | Yes | Yes |
| pthread_attr_getschedpolicy | 不支持的內(nèi)核調(diào)度策略是固定的 | ||
| pthread_attr_getscope | 不支持的內(nèi)核沒有進(jìn)程的概念 | ||
| pthread_attr_getstack | 獲取堆棧大小和地址屬性 | Yes | Yes |
| pthread_attr_getstacksize | 獲取屬性對象中的堆棧大小 | Yes | Yes |
| pthread_attr_init | 初始化線程屬性 | Yes | Yes |
| pthread_attr_setdetachstate | 在屬性對象中設(shè)置分離狀態(tài) | Yes | Yes |
| pthread_attr_setguardsize | 在屬性對象中設(shè)置保護(hù)大小 | Yes | Yes |
| pthread_attr_setinheritsched | 不支持的內(nèi)核調(diào)度策略是固定的 | ||
| pthread_attr_setschedparam | 在屬性對象中設(shè)置調(diào)度參數(shù) | Yes | Yes |
| pthread_attr_setschedpolicy | 不支持的內(nèi)核調(diào)度策略是固定的 | ||
| pthread_attr_setscope | 不支持的內(nèi)核沒有進(jìn)程的概念 | ||
| pthread_attr_setstack | 設(shè)置堆棧大小和地址 | Yes | Yes |
| pthread_attr_setstacksize | 設(shè)置堆棧大小 | Yes | Yes |
線程同步
| pthread_barrier_destroy | 摧毀一個障礙物 | Yes | Yes |
| pthread_barrier_init | 初始化一個障礙物體 | Yes | Yes |
| pthread_barrier_wait | 在屏障處同步 | No | Yes |
障礙屬性
| pthread_barrierattr_destroy | 破壞 barrier 屬性對象 | Yes | Yes |
| pthread_barrierattr_getpshared | 不支持的內(nèi)核沒有進(jìn)程的概念 | ||
| pthread_barrierattr_init | 初始化 barrier 屬性對象 | Yes | Yes |
| pthread_barrierattr_setpshared | 不支持的內(nèi)核沒有進(jìn)程的概念 |
條件變量
| pthread_cond_broadcast | 取消阻止條件變量上阻塞的所有線程 | No | Yes |
| pthread_cond_destroy | 為條件變量分配的可用資源 | Yes | Yes |
| pthread_cond_init | 分配和初始化條件變量 | Yes | Yes |
| pthread_cond_signal | 取消阻止等待條件變量的線程 | No | Yes |
| pthread_cond_timedwait | 使用超時等待條件變量 | No | Yes |
| pthread_cond_wait | 等待條件變量 | No | Yes |
條件變量屬性
| pthread_condattr_destroy | 銷毀條件變量屬性對象 | Yes | Yes |
| pthread_condattr_getclock | 不支持 | ||
| pthread_condattr_getpshared | 不支持 | ||
| pthread_condattr_init | 初始化條件變量屬性對象 | Yes | Yes |
| pthread_condattr_setclock | 不支持 | ||
| pthread_condattr_setpshared | 不支持 |
互斥鎖
| pthread_mutex_destroy | 為互斥對象分配的自由資源 | Yes | Yes |
| pthread_mutex_getprioceiling | 獲取互斥鎖的優(yōu)先級上限 | Yes | Yes |
| pthread_mutex_init | 分配和初始化互斥對象 | Yes | Yes |
| pthread_mutex_lock | 鎖定互斥鎖 | No | No |
| pthread_mutex_setprioceiling | 設(shè)置互斥鎖的優(yōu)先級上限 | No | Yes |
| pthread_mutex_timedlock | 等待帶超時的互斥對象 | No | No |
| pthread_mutex_trylock | 鎖定一個互斥鎖,如果它是可用的,不阻塞返回 | No | No |
| pthread_mutex_unlock | 解鎖調(diào)用線程擁有的互斥對象 | No | No |
互斥屬性
| pthread_mutexattr_destroy | 銷毀互斥屬性對象 | Yes | Yes |
| pthread_mutexattr_getprioceiling | 獲取互斥鎖屬性對象的優(yōu)先級上限 | Yes | Yes |
| pthread_mutexattr_getprotocol | 獲取互斥鎖屬性對象的協(xié)議 | Yes | Yes |
| pthread_mutexattr_getpshared | 不支持 | ||
| pthread_mutexattr_gettype | 獲取互斥類型屬性 | Yes | Yes |
| pthread_mutexattr_init | 初始化互斥屬性對象 | Yes | Yes |
| pthread_mutexattr_setprioceiling | 設(shè)置互斥對象的優(yōu)先級上限 | Yes | Yes |
| pthread_mutexattr_setprotocol | 設(shè)置互斥鎖屬性對象的協(xié)議 | Yes | Yes |
| pthread_mutexattr_setpshared | 不支持 | ||
| pthread_mutexattr_settype | 設(shè)置互斥類型屬性 | Yes | Yes |
讀寫鎖定
| pthread_rwlock_destroy | 銷毀一個讀寫鎖對象 | Yes | Yes |
| pthread_rwlock_init | 初始化一個讀寫鎖對象 | Yes | Yes |
| pthread_rwlock_rdlock | 鎖定讀寫鎖對象進(jìn)行讀取 | No | No |
| pthread_rwlock_timedrdlock | 鎖定一個讀寫鎖對象,用于超時讀取 | No | No |
| pthread_rwlock_timedwrlock | 使用超時鎖定寫入的讀寫鎖定 | No | No |
| pthread_rwlock_tryrdlock | 嘗試讀寫鎖以進(jìn)行讀取(非阻塞) | No | No |
| pthread_rwlock_trywrlock | 嘗試使用讀寫鎖進(jìn)行寫入(非阻塞) | No | No |
| pthread_rwlock_unlock | 解鎖一個讀寫鎖對象 | No | No |
| pthread_rwlock_wrlock | 鎖定一個讀寫鎖對象進(jìn)行寫入 | No | No |
讀寫鎖屬性
| pthread_rwlockattr_destroy | 銷毀讀寫鎖屬性對象 | Yes | Yes |
| pthread_rwlockattr_getpshared | 不支持 | ||
| pthread_rwlockattr_init | 初始化讀寫鎖屬性對象 | Yes | Yes |
| pthread_rwlockattr_setpshared | 不支持 |
輔助函數(shù)調(diào)用的前后關(guān)系
時鐘
| clock_gettime | 獲取當(dāng)前時間 | Yes | Yes |
| clock_nanosleep | 高分辨率睡眠,可指定時鐘 | No | Yes |
| clock_settime | 為CLOCK REALTIME時鐘設(shè)置當(dāng)前時間 | Yes | Yes |
消息隊列
| mq_close | 關(guān)閉消息隊列 | Yes | Yes |
| mq_getattr | 獲取消息隊列屬性 | Yes | Yes |
| mq_open | 打開一個消息隊列 | Yes | Yes |
| mq_receive | 從消息隊列接收消息 | No | Yes |
| mq_send | 向消息隊列發(fā)送消息 | No | Yes |
| mq_setattr | 設(shè)置消息隊列屬性 | Yes | Yes |
| mq_timedreceive | 接收來自消息隊列的消息,帶有超時 | No | Yes |
| mq_timedsend | 使用超時向消息隊列發(fā)送消息 | No | Yes |
| mq_unlink | 刪除消息隊列 | Yes | Yes |
信號量
| sem_destroy | 銷毀一個信號量 | Yes | Yes |
| sem_getvalue | 獲取信號量計數(shù) | Yes | Yes |
| sem_init | 初始化信號量 | Yes | Yes |
| sem_post | 解鎖一個信號量(即增加信號量計數(shù)) | Yes | Yes |
| sem_timedwait | 帶超時鎖定信號量 | No | Yes |
| sem_trywait | 嘗試鎖定信號量(非阻塞) | No | Yes |
| sem_wait | 鎖定信號量 | No | Yes |
睡眠
| nanosleep | 高分辨率睡眠 | No | Yes |
計時器
| timer_create | 創(chuàng)建一個計時器 | Yes | Yes |
| timer_delete | 刪除計時器 | Yes | Yes |
| timer_gettime | 獲取計時器到期之前的時間 | Yes | Yes |
| timer_settime | 設(shè)置計時器下一次到期的時間 | Yes | Yes |
注意事項
線程默認(rèn)堆棧大小和線程默認(rèn)優(yōu)先級
int pthread_attr_init(pthread_attr_t *attr)pthread_attr_init()使用默認(rèn)值初始化所指向的對象,其中包括堆棧大小和線程優(yōu)先級。pthread_attr_t、attr
在 TI-RTOS 上,默認(rèn)堆棧大小在配置腳本中定義。
在 FreeRTOS 上,使用 FreeRTOS.config.h 和 portmacro.h 頭文件中定義的值計算默認(rèn)堆棧大小如下。
configPOSIX_STACK_SIZE * sizeof(portSTACK_TYPE)注意,這是一個自定義符號,定義在SDK中的FreeRTOSConfig.h頭文件中。h頭文件是在FreeRTOS發(fā)行版中附帶的。configPOSIX_STACK_SIZE
優(yōu)先級設(shè)置為1,這是Idle任務(wù)之外允許的最低優(yōu)先級,Idle任務(wù)的優(yōu)先級為0。
線程調(diào)度策略
int pthread_getschedparam(pthread_t pthread, int *policy, struct sched_param *param) int pthread_setschedparam(pthread_t pthread, int policy, const struct sched_param *param)RTOS 內(nèi)核使用了一個基于優(yōu)先級的調(diào)度程序
FreeRTOS上的TI-POSIX
我們已經(jīng)盡最大努力在TI-RTOS和FreeRTOS之間提供同樣的支持。然而,這里也有一些例外。
沒有辦法將堆棧傳遞給xTaskCreate()。
互斥鎖的優(yōu)先級繼承由 FreeRTOS 處理。如果優(yōu)先級較高的任務(wù)試圖獲取互斥鎖,則擁有互斥的任務(wù)的優(yōu)先級會暫時提高。因此,FreeRTOS 不支持互斥協(xié)議。
pthread_mutexattr_getprotocol() //- not supported for FreeRTOS pthread_mutexattr_setprotocol() //- not supported for FreeRTOS pthread_mutexattr_getprioceiling() //- not supported for FreeRTOS pthread_mutexattr_setprioceiling() //- not supported for FreeRTOS只有CLOCK_REALTIME被clock_settime()支持
timer_settime() 這是一個阻塞調(diào)用,與 TI-RTOS 不同
任務(wù)清理由 FreeRTOS 中的 Idle 任務(wù)完成。如果 pthreads 被刪除,請確保 Idle 任務(wù)有機會運行到已刪除線程的空閑分配內(nèi)存中。
二進(jìn)制信號量
. POSIX不支持二進(jìn)制信號量。也就是說,一個信號量可以被傳遞多次,但計數(shù)不能大于1。下一個等待將計數(shù)減少到0
幸運的是,使用互斥量和條件變量很容易構(gòu)建二進(jìn)制信號量。下面是一個偽代碼示例。
總結(jié)
以上是生活随笔為你收集整理的MSP432P401R TI Drivers 库函数学习笔记(二)认识TI-RTOS (TI-POSIX)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用IAR开发CC2530遇到的两个问题
- 下一篇: 汽车电子零部件电磁兼容EMC测试标准