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