日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MSP432P401R TI Drivers 库函数学习笔记(二)认识TI-RTOS (TI-POSIX)

發(fā)布時間:2023/12/9 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MSP432P401R TI Drivers 库函数学习笔记(二)认识TI-RTOS (TI-POSIX) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

  • 簡介
    • 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)系

線程管理

函數(shù)名用途maintask
pthread_cancel向線程發(fā)送取消請求NoYes
pthread_cleanup_pop彈出線程取消清理處理程序NoYes
pthread_cleanup_push推取消線程清理處理程序NoNo
pthread_create創(chuàng)建一個新線程YesYes
pthread_detach分離一個線程NoYes
pthread_equal比較線程 idYesYes
pthread_exit終止調(diào)用線程NoNo
pthread_getconcurrency不支持
pthread_getcpuclockid不支持
pthread_getschedparam用于獲取 pthread 的優(yōu)先級NoYes
pthread_getspecific獲取調(diào)用線程的線程特定數(shù)據(jù)NoNo
pthread_join用終止線程連接NoYes
pthread_key_create創(chuàng)建特定于線程的數(shù)據(jù)鍵NoNo
pthread_key_delete刪除線程特定的數(shù)據(jù)鍵NoNo
pthread_once運行一次初始化例程NoYes
pthread_self獲取調(diào)用線程的 IDNoNo
pthread_setcancelstate設(shè)置取消能力狀態(tài)和類型NoNo
pthread_setcanceltype不支持。只支持異步取消
pthread_setconcurrency不支持
pthread_setschedparam用于設(shè)置線程的優(yōu)先級NoNo
pthread_setschedprio不支持。使用 pthread_setschedparam 來設(shè)置優(yōu)先級
pthread_setspecific設(shè)置調(diào)用線程的線程特定數(shù)據(jù)NoNo
pthread_testcancel不支持

線程屬性

函數(shù)名用途maintask
pthread_attr_destroy銷毀線程屬性對象YesYes
pthread_attr_getdetachstate獲取屬性對象中的分離狀態(tài)YesYes
pthread_attr_getguardsize獲取屬性對象中的保護(hù)大小YesYes
pthread_attr_getinheritsched不支持的內(nèi)核調(diào)度策略是固定的
pthread_attr_getschedparam獲取屬性對象中的調(diào)度參數(shù)YesYes
pthread_attr_getschedpolicy不支持的內(nèi)核調(diào)度策略是固定的
pthread_attr_getscope不支持的內(nèi)核沒有進(jìn)程的概念
pthread_attr_getstack獲取堆棧大小和地址屬性YesYes
pthread_attr_getstacksize獲取屬性對象中的堆棧大小YesYes
pthread_attr_init初始化線程屬性YesYes
pthread_attr_setdetachstate在屬性對象中設(shè)置分離狀態(tài)YesYes
pthread_attr_setguardsize在屬性對象中設(shè)置保護(hù)大小YesYes
pthread_attr_setinheritsched不支持的內(nèi)核調(diào)度策略是固定的
pthread_attr_setschedparam在屬性對象中設(shè)置調(diào)度參數(shù)YesYes
pthread_attr_setschedpolicy不支持的內(nèi)核調(diào)度策略是固定的
pthread_attr_setscope不支持的內(nèi)核沒有進(jìn)程的概念
pthread_attr_setstack設(shè)置堆棧大小和地址YesYes
pthread_attr_setstacksize設(shè)置堆棧大小YesYes

線程同步

函數(shù)名用途maintask
pthread_barrier_destroy摧毀一個障礙物YesYes
pthread_barrier_init初始化一個障礙物體YesYes
pthread_barrier_wait在屏障處同步NoYes

障礙屬性

函數(shù)名用途maintask
pthread_barrierattr_destroy破壞 barrier 屬性對象YesYes
pthread_barrierattr_getpshared不支持的內(nèi)核沒有進(jìn)程的概念
pthread_barrierattr_init初始化 barrier 屬性對象YesYes
pthread_barrierattr_setpshared不支持的內(nèi)核沒有進(jìn)程的概念

條件變量

函數(shù)名用途maintask
pthread_cond_broadcast取消阻止條件變量上阻塞的所有線程NoYes
pthread_cond_destroy為條件變量分配的可用資源YesYes
pthread_cond_init分配和初始化條件變量YesYes
pthread_cond_signal取消阻止等待條件變量的線程NoYes
pthread_cond_timedwait使用超時等待條件變量NoYes
pthread_cond_wait等待條件變量NoYes

條件變量屬性

函數(shù)名用途maintask
pthread_condattr_destroy銷毀條件變量屬性對象YesYes
pthread_condattr_getclock不支持
pthread_condattr_getpshared不支持
pthread_condattr_init初始化條件變量屬性對象YesYes
pthread_condattr_setclock不支持
pthread_condattr_setpshared不支持

互斥鎖

函數(shù)名用途maintask
pthread_mutex_destroy為互斥對象分配的自由資源YesYes
pthread_mutex_getprioceiling獲取互斥鎖的優(yōu)先級上限YesYes
pthread_mutex_init分配和初始化互斥對象YesYes
pthread_mutex_lock鎖定互斥鎖NoNo
pthread_mutex_setprioceiling設(shè)置互斥鎖的優(yōu)先級上限NoYes
pthread_mutex_timedlock等待帶超時的互斥對象NoNo
pthread_mutex_trylock鎖定一個互斥鎖,如果它是可用的,不阻塞返回NoNo
pthread_mutex_unlock解鎖調(diào)用線程擁有的互斥對象NoNo

互斥屬性

函數(shù)名用途maintask
pthread_mutexattr_destroy銷毀互斥屬性對象YesYes
pthread_mutexattr_getprioceiling獲取互斥鎖屬性對象的優(yōu)先級上限YesYes
pthread_mutexattr_getprotocol獲取互斥鎖屬性對象的協(xié)議YesYes
pthread_mutexattr_getpshared不支持
pthread_mutexattr_gettype獲取互斥類型屬性YesYes
pthread_mutexattr_init初始化互斥屬性對象YesYes
pthread_mutexattr_setprioceiling設(shè)置互斥對象的優(yōu)先級上限YesYes
pthread_mutexattr_setprotocol設(shè)置互斥鎖屬性對象的協(xié)議YesYes
pthread_mutexattr_setpshared不支持
pthread_mutexattr_settype設(shè)置互斥類型屬性YesYes

讀寫鎖定

函數(shù)名用途maintask
pthread_rwlock_destroy銷毀一個讀寫鎖對象YesYes
pthread_rwlock_init初始化一個讀寫鎖對象YesYes
pthread_rwlock_rdlock鎖定讀寫鎖對象進(jìn)行讀取NoNo
pthread_rwlock_timedrdlock鎖定一個讀寫鎖對象,用于超時讀取NoNo
pthread_rwlock_timedwrlock使用超時鎖定寫入的讀寫鎖定NoNo
pthread_rwlock_tryrdlock嘗試讀寫鎖以進(jìn)行讀取(非阻塞)NoNo
pthread_rwlock_trywrlock嘗試使用讀寫鎖進(jìn)行寫入(非阻塞)NoNo
pthread_rwlock_unlock解鎖一個讀寫鎖對象NoNo
pthread_rwlock_wrlock鎖定一個讀寫鎖對象進(jìn)行寫入NoNo

讀寫鎖屬性

函數(shù)名用途maintask
pthread_rwlockattr_destroy銷毀讀寫鎖屬性對象YesYes
pthread_rwlockattr_getpshared不支持
pthread_rwlockattr_init初始化讀寫鎖屬性對象YesYes
pthread_rwlockattr_setpshared不支持

輔助函數(shù)調(diào)用的前后關(guān)系

時鐘

函數(shù)名用途maintask
clock_gettime獲取當(dāng)前時間YesYes
clock_nanosleep高分辨率睡眠,可指定時鐘NoYes
clock_settime為CLOCK REALTIME時鐘設(shè)置當(dāng)前時間YesYes

消息隊列

函數(shù)名用途maintask
mq_close關(guān)閉消息隊列YesYes
mq_getattr獲取消息隊列屬性YesYes
mq_open打開一個消息隊列YesYes
mq_receive從消息隊列接收消息NoYes
mq_send向消息隊列發(fā)送消息NoYes
mq_setattr設(shè)置消息隊列屬性YesYes
mq_timedreceive接收來自消息隊列的消息,帶有超時NoYes
mq_timedsend使用超時向消息隊列發(fā)送消息NoYes
mq_unlink刪除消息隊列YesYes

信號量

函數(shù)名用途maintask
sem_destroy銷毀一個信號量YesYes
sem_getvalue獲取信號量計數(shù)YesYes
sem_init初始化信號量YesYes
sem_post解鎖一個信號量(即增加信號量計數(shù))YesYes
sem_timedwait帶超時鎖定信號量NoYes
sem_trywait嘗試鎖定信號量(非阻塞)NoYes
sem_wait鎖定信號量NoYes

睡眠

函數(shù)名用途maintask
nanosleep高分辨率睡眠NoYes

計時器

函數(shù)名用途maintask
timer_create創(chuàng)建一個計時器YesYes
timer_delete刪除計時器YesYes
timer_gettime獲取計時器到期之前的時間YesYes
timer_settime設(shè)置計時器下一次到期的時間YesYes

注意事項

線程默認(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)堆棧大小在配置腳本中定義。

var Task = xdc.useModule('ti.sysbios.knl.Task'); Task.defaultStackSize = 0x800;

在 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()。

pthread_attr_setstack() // - not supported on FreeRTOS

互斥鎖的優(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)制信號量。下面是一個偽代碼示例。

struct binary_semaphore {pthread_mutex_t mutex;pthread_cond_t cvar;int v; };void mysem_post(struct binary_semaphore *p) {pthread_mutex_lock(&p->mutex);p->v = 1;pthread_cond_signal(&p->cvar);pthread_mutex_unlock(&p->mutex); }void mysem_pend(struct binar_semaphore *p) {pthread_mutex_lock(&p->mutex);while (!p->v) {pthread_cond_wait(&p->cvar, &p->mutex);}p->v = 0;pthread_mutex_unlock(&p->mutex); }

總結(jié)

以上是生活随笔為你收集整理的MSP432P401R TI Drivers 库函数学习笔记(二)认识TI-RTOS (TI-POSIX)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。