色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何理解CMSIS-RTOS API和宏定義

strongerHuang ? 來源:strongerHuang ? 作者:Mculover666 ? 2020-08-26 11:54 ? 次閱讀

1. CMSIS-RTOS API

CMSIS-RTOS API是ARM公司為RTOS內核制定的一套通用接口協(xié)議,它提供了一套「標準的API接口,可以移植到各種各樣的RTOS上,使得上層的軟件、中間件、庫以及其他組件在不同的RTOS之上都可以正常工作。

這套API表現(xiàn)為兩個文件:cmsis-os.h和cmsis-os.c,也就是說,不同的RTOS內核分別用自己的一套東西去適配.c文件中的接口,而用戶只需要調用.h文件中給出的API編寫應用。

本文會列舉性的給出CMSIS-RTOS有哪些API和宏定義,并給出每類API的使用demo,學習者只需要了解這些東西,能看懂用CMSIS-RTOS API編寫的應用程序即可~

TencentOS-tiny中如下。

基于TencentOS-tiny的CMSIS-RTOS API v1.02版本實現(xiàn):

cmsis_os.h

cmsis_os.c

基于TencentOS-tiny的CMSIS-RTOS API v2.1.3版本實現(xiàn):

cmsis_os2.h

cmsis_os2.c

CMSIS-RTOS API的整體架構如下圖:

2. CMSIS-RTOS API列表

下面列出了 CMSIS-RTOS API v1.02 版本提供的所有API。

CMSIS-RTOS 所有API使用的錯誤碼(cmsis-os.h):

typedefenum{

osOK=0,///

CMSIS-RTOS API一些可選項控制是否開啟(cmsis-os.h):

#defineosFeature_MainThread1///

#defineosFeature_Pool1///

2.1. 內核信息和控制

API 描述
osKernelInitialize 初始化RTOS內核
osKernelStart 啟動RTOS內核
osKernelRunning Query if the RTOS kernel is running
osKernelSysTick (可選) Get RTOS kernel system timer counter
osKernelSysTickFrequency (可選) RTOS kernel system timer frequency in Hz
osKernelSysTickMicroSec (可選) Convert microseconds value to RTOS kernel system timer value

osKernelInitialize

osStatusosKernelInitialize(void);

返回值:status code

osKernelStart

osStatusosKernelStart(void);

返回值:status code

osKernelRunning

int32_tosKernelRunning(void);

返回值:0表示RTOS未啟動,1表示RTOS已經啟動

osKernelSysTick

uint32_tosKernelSysTick(void);

返回值:RTOS內核系統(tǒng)當前的時間

2.2. 線程管理

?

##連接符的作用是連接兩個字符串,合為一個字符串。

?

CMSIS-RTOS API 存放線程參數(shù)管理的結構體如下:typedefstructos_thread_def{

char*name;///

CMSIS-RTOS API 定義線程的宏如下:

#defineosThreadDef(name,priority,instances,stacksz)

k_task_ttask_handler_##name;
k_stack_ttask_stack_##name[(stacksz)];
constosThreadDef_tos_thread_def_##name=
{#name,(os_pthread)(name),(osPriority)(priority),(instances),
(&((task_stack_##name)[0])),(stacksz),((k_timeslice_t)0u),(&(task_handler_##name))}

?

宏定義中的 instances 表示基于此任務參數(shù),創(chuàng)建出幾個任務實例,比如instances為2,則會創(chuàng)建出兩個任務。

?

CMSIS-RTOS API定義的獲取線程參數(shù)結構體的宏如下:

#defineosThread(name)

&os_thread_def_##name

管理線程參數(shù)的API如下:

API 描述
osThreadCreate 創(chuàng)建線程并開始執(zhí)行
osThreadTerminate 停止線程執(zhí)行
osThreadYield 線程主動讓出
osThreadGetID 獲取當前正在運行線程的ID
osThreadSetPriority 改變線程優(yōu)先級
osThreadGetPriority 獲取線程優(yōu)先級

osThreadCreate

osThreadIdosThreadCreate(constosThreadDef_t*thread_def,void*argument);

其中osThreadId被定義為k_task_t指針類型:typedefk_task_t*osThreadId;

返回值:TencentOS-tiny中的任務控制塊類型指針。

osThreadTerminate

osStatusosThreadTerminate(osThreadIdthread_id);

返回值:osStatus

osThreadYield

osStatusosThreadYield(void);

返回值:osStatus

osThreadGetID

osThreadIdosThreadGetId(void);

osThreadSetPriority

osStatusosThreadSetPriority(osThreadIdthread_id,osPrioritypriority);

osThreadGetPriority

osPriorityosThreadGetPriority(osThreadIdthread_id);

?

使用時需要特別注意,在TencentOS-tiny中,調用CMSIS-RTOS API提供的優(yōu)先級選項設置之后,實際設置的任務值是不同的。

?

CMSIS-RTOS API提供的線程優(yōu)先級宏定義如下:

typedefenum{

osPriorityIdle=-3,///

statick_prio_tpriority_cmsis2knl(osPriorityprio)

{
if(prio==osPriorityError){
returnK_TASK_PRIO_INVALID;
}

return(k_prio_t)(3-prio);
}

staticosPrioritypriority_knl2cmsis(k_prio_tprio)
{
return(osPriority)(3-prio);
}

比如創(chuàng)建線程時設置為 osPriorityNormal=0,則「實際設置的任務優(yōu)先級為3」

2.3. 通用等待函數(shù)

CMSIS-RTOS提供的等待函數(shù)API如下:

API 描述
osDelay 等待指定的時間
osWait(可選) 等待信號、消息、郵箱的某個事件

osDelay

osStatusosDelay(uint32_tmillisec);

返回值:osStatus。

2.4. 軟件定時器管理

CMSIS-RTOS API提供的存儲定時器參數(shù)的結構體如下:typedefstructos_timer_def{

os_ptimercb;///

CMSIS-RTOS API提供的定義一個軟件定時器的宏定義如下:

#defineosTimerDef(name,function)

k_timer_ttimer_handler_##name;
constosTimerDef_tos_timer_def_##name=
{(os_ptimer)(function),(&(timer_handler_##name))}

CMSIS-RTOS API定義的獲取軟件定時器參數(shù)結構體的宏如下:

#defineosTimer(name)

&os_timer_def_##name

CMSIS-RTOS API提供的軟件定時器管理API如下:

API 描述
osTimerCreate 創(chuàng)建一個軟件定時器
osTimerStart 啟動軟件定時器
osTimerStop 停止軟件定時器
osTimerDelete 刪除軟件定時器

osTimerCreate

osTimerIdosTimerCreate(constosTimerDef_t*timer_def,os_timer_typetype,void*argument);

其中osTimerId被定義為k_timer_t指針類型:

typedefk_timer_t*osTimerId;

type參數(shù)為 os_timer_type 類型,表示軟件定時器的類型為單次觸發(fā)或者周期觸發(fā):

typedefenum{

osTimerOnce=0,///

osTimerStart

osStatusosTimerStart(osTimerIdtimer_id,uint32_tmillisec);

返回值:osStatus。

osTimerStop

osStatusosTimerStop(osTimerIdtimer_id)

返回值:osStatus。

osTimerDelete

osStatusosTimerDelete(osTimerIdtimer_id);

返回值:osStatus。

2.5. 信號量管理

CMSIS-RTOS API提供的存儲信號量參數(shù)的結構體如下:

typedefstructos_semaphore_def{

uint32_tdummy;///

CMSIS-RTOS API提供的定義一個信號量的宏定義如下:

#defineosSemaphoreDef(name)

k_sem_tsem_handler_##name;
constosSemaphoreDef_tos_semaphore_def_##name={0,(&(sem_handler_##name))}

CMSIS-RTOS API定義的獲取信號量參數(shù)結構體的宏如下:

#defineosSemaphore(name)

&os_semaphore_def_##name

CMSIS-RTOS API提供的信號量管理API如下:

API 描述
osSemaphoreCreate 創(chuàng)建一個信號量
osSemaphoreWait 等待信號量
osSemaphoreRelease 釋放信號量
osSemaphoreDelete 刪除信號量

osSemaphoreCreate

osSemaphoreIdosSemaphoreCreate(constosSemaphoreDef_t*semaphore_def,int32_tcount);

其中 osSemaphoreId 被定義為k_sem_t指針類型:

typedefk_sem_t*osSemaphoreId;

osSemaphoreWait

int32_tosSemaphoreWait(osSemaphoreIdsemaphore_id,uint32_tmillisec);

返回值:int32_t ,正常返回當前count數(shù),失敗返回-1。

如果需要阻塞延時,參數(shù)應該設置為CMSIS-RTOS API提供的宏定義 osWaitForever :

#defineosWaitForever0xFFFFFFFF///

osSemaphoreRelease

osStatusosSemaphoreRelease(osSemaphoreIdsemaphore_id);

返回值:osStatus。

osSemaphoreDelete

osStatusosSemaphoreDelete(osSemaphoreIdsemaphore_id);

返回值:osStatus。

2.6. 互斥鎖管理

CMSIS-RTOS API提供的存儲互斥鎖參數(shù)的結構體如下:

typedefstructos_mutex_def{

uint32_tdummy;///

CMSIS-RTOS API提供的定義一個互斥鎖的宏定義如下:

#defineosMutexDef(name)

k_mutex_tmutex_handler_##name;
constosMutexDef_tos_mutex_def_##name={0,(&(mutex_handler_##name))}

CMSIS-RTOS API定義的獲取互斥鎖參數(shù)結構體的宏如下:

#defineosMutex(name)

&os_mutex_def_##name

CMSIS-RTOS API提供的互斥鎖管理API如下:

API 描述
osMutexCreate 創(chuàng)建一個互斥鎖
osMutexWait 等待獲取互斥鎖
osMutexRelease 釋放互斥鎖
osMutexDelete 刪除互斥鎖

osMutexCreate

osMutexIdosMutexCreate(constosMutexDef_t*mutex_def);

其中 osMutexId 被定義為k_mutex_t指針類型:

typedefk_mutex_t*osMutexId;

osMutexWait

osStatusosMutexWait(osMutexIdmutex_id,uint32_tmillisec);

返回值:osStatus 。

如果需要阻塞延時,參數(shù)應該設置為CMSIS-RTOS API提供的宏定義 osWaitForever :

#defineosWaitForever0xFFFFFFFF///

osMutexRelease

osStatusosMutexRelease(osMutexIdmutex_id);

返回值:osStatus。

osMutexDelete

osStatusosMutexDelete(osMutexIdmutex_id);

返回值:osStatus。

2.7. 靜態(tài)內存池管理

CMSIS-RTOS API提供的存儲靜態(tài)內存池參數(shù)的結構體如下:

typedefstructos_pool_def{

uint32_tpool_sz;///

CMSIS-RTOS API提供的定義一個互斥鎖的宏定義如下:

#defineosPoolDef(name,no,type)

k_mmblk_pool_tmmblk_pool_handler_##name;
uint8_tmmblk_pool_buf_##name[(no)*sizeof(type)];
constosPoolDef_tos_pool_def_##name=
{(no),sizeof(type),(&((mmblk_pool_buf_##name)[0])),(&(mmblk_pool_handler_##name))}

CMSIS-RTOS API定義的獲取互斥鎖參數(shù)結構體的宏如下:

#defineosPool(name)

&os_pool_def_##name

CMSIS-RTOS API提供的互斥鎖管理API如下:

API 描述
osPoolCreate 創(chuàng)建一塊固定大小的靜態(tài)內存池
osPoolAlloc 申請分配內存
osPoolCAlloc 申請分配一塊內存并全部初始化為0
osPoolFree 申請回收內存

osPoolCreate

osPoolIdosPoolCreate(constosPoolDef_t*pool_def);

其中 osPoolId 被定義為 k_mmblk_pool_t 指針類型:

typedefk_mmblk_pool_t*osPoolId;

osPoolAlloc

void*osPoolAlloc(osPoolIdpool_id);

osPoolCAlloc

void*osPoolCAlloc(osPoolIdpool_id);

osPoolFree

osStatusosPoolFree(osPoolIdpool_id,void*block);

返回值:osStatus。

2.8. 消息隊列管理

CMSIS-RTOS API提供的存儲消息隊列參數(shù)的結構體如下:

typedefstructos_messageQ_def{

uint32_tqueue_sz;///

CMSIS-RTOS API提供的定義一個消息隊列的宏定義如下:

#defineosMessageQDef(name,queue_sz,type)

k_msg_q_tmsg_q_handler_##name;
constosMessageQDef_tos_messageQ_def_##name=
{(queue_sz),sizeof(type),NULL,(&(msg_q_handler_##name))}

CMSIS-RTOS API定義的獲取消息隊列參數(shù)結構體的宏如下:

#defineosMessageQ(name)

&os_messageQ_def_##name

CMSIS-RTOS API提供的消息隊列管理API如下:

API 描述
osMessageCreate 初始化一個消息隊列
osMessagePut 向消息隊列中加入數(shù)據(jù)
osMessageGet 從消息隊列中取出數(shù)據(jù)

osMessageCreate

osMessageQIdosMessageCreate(constosMessageQDef_t*queue_def,osThreadIdthread_id);

其中 osMessageQId 被定義為 k_msg_q_t 指針類型:

typedefk_msg_q_t*osMessageQId;

osMessagePut

osStatusosMessagePut(osMessageQIdqueue_id,uint32_tinfo,uint32_tmillisec);

返回值:osStatus 。

?

因為TencentOS-tiny中消息隊列實現(xiàn)機制的不同,此API中的 millisec 參數(shù)未用到。

?

osMessageGet

osEventosMessageGet(osMessageQIdqueue_id,uint32_tmillisec);

返回值:osEvent ,其中包含了事件信息和錯誤碼,以及消息隊列收到的值。

如果需要阻塞延時,參數(shù)應該設置為CMSIS-RTOS API提供的宏定義 osWaitForever :

#defineosWaitForever0xFFFFFFFF///

3. 使用示例

3.1. 任務創(chuàng)建示例

#include

voidtask1_entry(void*arg)
{
while(1)
{
printf("task1isrunning...
");
osDelay(1000);
}
}
osThreadDef(task1_entry,osPriorityNormal,1,512);

voidtask2_entry(void*arg)
{

while(1)
{
printf("task2isrunning...
");
osDelay(1000);
}
}
osThreadDef(task2_entry,osPriorityNormal,1,512);

voidapplication_entry(void*arg)
{

osThreadCreate(osThread(task1_entry),NULL);
osThreadCreate(osThread(task2_entry),NULL);

return;
}

任務運行結果如下:

task1isrunning...
task2isrunning...
task1isrunning...
task2isrunning...
task1isrunning...
task2isrunning...

3.2. 軟件定時器使用示例

#include

voidtimer1_cb(void*arg)
{
printf("timer1istimeout!
");
}

voidtimer2_cb(void*arg)
{
printf("timer2istimeout!
");
}

osTimerDef(timer1,timer1_cb);
osTimerDef(timer2,timer2_cb);

voidapplication_entry(void*arg)
{
osTimerIdtimer1;
osTimerIdtimer2;

timer1=osTimerCreate(osTimer(timer1),osTimerOnce,NULL);
timer2=osTimerCreate(osTimer(timer2),osTimerPeriodic,NULL);

osTimerStart(timer1,5000);
osTimerStart(timer2,1000);

return;
}

運行結果如下:

timer2istimeout!
timer2istimeout!
timer2istimeout!
timer2istimeout!
timer1istimeout!
timer2istimeout!
timer2istimeout!
timer2istimeout!
timer2istimeout!

3.3. 信號量使用示例

#include

osSemaphoreIdsync_sem_id;
osSemaphoreDef(sync_sem);

voidtask1_entry(void*arg)
{
while(1)
{
printf("task1iswaitingsemforever...
");
osSemaphoreWait(sync_sem_id,osWaitForever);
printf("task1getsem!
");
}
}
osThreadDef(task1_entry,osPriorityNormal,1,512);

voidtask2_entry(void*arg)
{

while(1)
{
printf("task2willreleaseasem...
");
osSemaphoreRelease(sync_sem_id);
osDelay(1000);
}
}
osThreadDef(task2_entry,osPriorityNormal,1,512);

voidapplication_entry(void*arg)
{
sync_sem_id=osSemaphoreCreate(osSemaphore(sync_sem),0);

osThreadCreate(osThread(task1_entry),NULL);
osThreadCreate(osThread(task2_entry),NULL);

return;
}

運行結果為:

task1iswaitingsemforever...
task1getsem!
task1iswaitingsemforever...
task2willreleaseasem...
task1getsem!
task1iswaitingsemforever...
task2willreleaseasem...
task1getsem!
task1iswaitingsemforever...
task2willreleaseasem...
task1getsem!
task1iswaitingsemforever...
task2willreleaseasem...
task1getsem!
task1iswaitingsemforever...

3.4. 互斥鎖使用示例

#include

osMutexIdsync_mutex_id;
osMutexDef(sync_mutex);

voidtask1_entry(void*arg)
{
while(1)
{
osMutexWait(sync_mutex_id,osWaitForever);

printf("task1getmutex,doingsth...
");
HAL_Delay(1000);//死循環(huán)占用CPU
printf("task1finishdosth!
");

osMutexRelease(sync_mutex_id);

osDelay(1000);
}
}
osThreadDef(task1_entry,osPriorityHigh,1,512);

voidtask2_entry(void*arg)
{

while(1)
{
osMutexWait(sync_mutex_id,osWaitForever);

printf("task2getmutex,doingsth...
");
HAL_Delay(2000);//死循環(huán)占用CPU
printf("task2finishdosth!
");

osMutexRelease(sync_mutex_id);

osDelay(1000);
}
}
osThreadDef(task2_entry,osPriorityNormal,1,512);

voidapplication_entry(void*arg)
{
sync_mutex_id=osMutexCreate(osMutex(sync_mutex));

osThreadCreate(osThread(task1_entry),NULL);
osThreadCreate(osThread(task2_entry),NULL);

return;
}

運行結果為:

task1getmutex,doingsth...
task1finishdosth!
task2getmutex,doingsth...
task2finishdosth!
task1getmutex,doingsth...
task1finishdosth!
task1getmutex,doingsth...
task1finishdosth!
task2getmutex,doingsth...

3.5. 動態(tài)內存使用示例

#include

typedefstructblk_st{
intid;
char*payload;
}blk_t;

#defineMMBLK_BLK_NUM10

osPoolDef(MemPool,MMBLK_BLK_NUM,blk_t);
osPoolIdmem_pool_id;

voidtask1_entry(void*arg)
{

blk_t*ptr=NULL;
osStatuserr;

/*打印出一個塊的大小*/
printf("blocksizeis%dbytes
",sizeof(blk_t));

/*申請一個塊*/
ptr=osPoolAlloc(mem_pool_id);
if(ptr==NULL){
printf("ammblkallocfail
");
return;
}
else{
printf("ammblkallocsuccess
");
}

/*使用該塊*/
ptr->id=1;
ptr->payload="hello";
printf("mmblkid:%dpayload:%s
",ptr->id,ptr->payload);

/*使用完畢之后釋放*/
err=osPoolFree(mem_pool_id,ptr);
if(err!=osOK){
printf("ammblkfreefail,err=%d
",err);
return;
}
else{
printf("ammblkfreesuccess
");
}

while(1){
tos_task_delay(1000);
}
}

#defineSTK_SIZE_TASK11024
osThreadDef(task1_entry,osPriorityNormal,1,STK_SIZE_TASK1);

voidapplication_entry(void*arg)
{
//初始化靜態(tài)內存池
mem_pool_id=osPoolCreate(osPool(MemPool));
if(mem_pool_id==NULL){
printf("mmblkpoolcreatefail
");
return;
}
else{
printf("mmblkpoolcreatesuccess
");
}

//創(chuàng)建任務
osThreadCreate(osThread(task1_entry),NULL);

return;
}

運行結果為:

mmblkpoolcreatesuccess
blocksizeis8bytes
ammblkallocsuccess
mmblkid:1payload:hello
ammblkfreesuccess

3.6. 消息隊列使用示例

#include

#defineSTK_SIZE_TASK_RECEIVER512
#defineSTK_SIZE_TASK_SENDER512

#defineMESSAGE_MAX10

osMessageQIdmsg_q_id;
osMessageQDef(msg_q,MESSAGE_MAX,uint32_t);

voidtask_receiver_entry(void*arg)
{
osEventevent;
osStatusret;
uint32_tvalue;

while(1)
{
event=osMessageGet(msg_q_id,osWaitForever);
ret=event.status;
if(ret==osOK)
{
value=event.value.v;
printf("receiver:msgincoming[%s]
",(char*)value);
}
}
}
osThreadDef(task_receiver_entry,osPriorityNormal,1,STK_SIZE_TASK_RECEIVER);

voidtask_sender_entry(void*arg)
{
char*msg_prio_0="msg0";
char*msg_prio_1="msg1";
char*msg_prio_2="msg2";

printf("sender:postamessgae:[%s]
",msg_prio_2);
osMessagePut(msg_q_id,(uint32_t)msg_prio_2,0);

printf("sender:postamessgae:[%s]
",msg_prio_1);
osMessagePut(msg_q_id,(uint32_t)msg_prio_1,0);

printf("sender:postamessgae:[%s]
",msg_prio_0);
osMessagePut(msg_q_id,(uint32_t)msg_prio_0,0);

}
osThreadDef(task_sender_entry,osPriorityNormal,1,STK_SIZE_TASK_SENDER);

voidapplication_entry(void*arg)
{
msg_q_id=osMessageCreate(osMessageQ(msg_q),NULL);

osThreadCreate(osThread(task_receiver_entry),NULL);
osThreadCreate(osThread(task_sender_entry),NULL);

return;
}

運行結果為:

sender:postamessgae:[msg2]
sender:postamessgae:[msg1]
sender:postamessgae:[msg0]
receiver:msgincoming[msg2]
receiver:msgincoming[msg1]
receiver:msgincoming[msg0]
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 內核
    +關注

    關注

    3

    文章

    1392

    瀏覽量

    40610
  • API
    API
    +關注

    關注

    2

    文章

    1530

    瀏覽量

    62798
  • CMSIS
    +關注

    關注

    0

    文章

    40

    瀏覽量

    12021

原文標題:CMSIS RTOS API,內核通用API接口

文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    RTOS為什么要搞兩種API?

    在STM32上使用FreeRTOS,可以直接使用FreeRTOS的原生接口(原生API),源碼移植就是使用的是原生API接口,這無可厚非。你也可以選擇CMSIS接口,實際上CMSIS
    的頭像 發(fā)表于 03-11 14:33 ?4903次閱讀

    CMSIS-RTOS V1與V2的區(qū)別是什么?

    最近的學習FreeRTOS,看到STM32CubeMX分別用CMSIS-RTOS V1,V2進行封裝,請教CMSIS-RTOS V1與V2的有什么區(qū)別?如果用在產品項目,哪個版本合適?
    發(fā)表于 04-11 06:06

    請問CMSIS-RTOS RTX的任務調度鎖在哪里?

    請問一下,CMSIS-RTOS RTX的任務調度鎖在哪里?謝謝!
    發(fā)表于 05-13 08:28

    請問CMSIS-RTOS怎么調試?

    如果用的是MDK的RTX組件,調試倒是很簡單,問題是用CUBEMX生成的CMSIS-RTOS就不知道有什么好辦法調試了。 各位有什么好的方法
    發(fā)表于 05-14 06:40

    FreeRTOS按耐不住,也加入MDK軟件包大陣營

    轉新消息說明:1. ARM也是能夠倒騰,進入MDK5系列之后,為RTX系統(tǒng)增加了一個封裝層CMSIS-RTOS,不過這個RTX還是基于RTX4.XX版本。最近的版本終于倒騰出來RTX5了,為其再次
    發(fā)表于 03-30 16:08

    KEIL CMSIS RTOS使用說明

    KEIL CMSIS RTOS使用說明
    發(fā)表于 04-18 17:06

    請問這個#define A (1)定義該怎么理解

    在讀程序的過程中遇到了這樣的一個定義,求大神解釋應該怎么理解?括號不知道該怎么理解.......
    發(fā)表于 10-11 01:01

    CMISIS-RTOS中thread相關API概覽

    一.CMISIS-RTOS中thread相關API概覽 模塊定義描述 線程定義osThreadDef
    發(fā)表于 08-24 08:09

    STM32CubeIDE+FREERTOS的相關資料下載

    調用,需要細致研讀代碼才行。。。而且CMSIS_RTOS封裝的功能并不全面,當需要實現(xiàn)復雜功能時,還是得直接調用FREERTOS的API。2. 想要使用通用的CMSIS_RTOS封裝,需要研讀其代碼,
    發(fā)表于 02-09 07:57

    基于Arm Cortex-A的入門級處理器CMSIS介紹

    CMSIS 組件符合Arm 架構的應用程序二進制接口 (ABI)(CMSIS-RTOS v1 除外)。這確保了支持各種工具鏈之間互操作的 C API 接口。由于 CMSIS
    發(fā)表于 04-22 09:25

    如何讓CMSIS RTOS V1在應用程序中與CMSIS RTOS V2集成呢?

    有沒有辦法讓CMSIS RTOS V1在應用程序中與CMSIS RTOS V2集成呢?
    發(fā)表于 12-12 08:29

    請問osThreadSuspendAll() 的CMSIS-RTOS v2替代品是什么?

    嘗試將我的代碼移植到 CMSIS-RTOS v2 并遇到一些缺失的功能。我沒有看到 osThreadSuspendAll() 替換。
    發(fā)表于 01-05 07:25

    將RTX遷移到CMSIS-RTOS

    CMSIS-RTOS API是基于Cortex-M處理器的設備的通用RTOS接口。 CMSIS-RTOS為需要RTOS功能的軟件組件提供了標
    發(fā)表于 09-04 06:37

    CMSIS-RTOS是什么?

    我們在使用STM32CubeMX配置FreeRTOS時有一個CMSIS_V1和CMSIS_V2的選項,你知道CMSIS_V1和CMSIS_V2區(qū)別是什么?
    的頭像 發(fā)表于 04-11 10:53 ?1528次閱讀

    現(xiàn)在是使用標準RTOS API的時間了嗎?

    與嵌入式MCU一起使用的RTOS的名單很長,其中大多數(shù)都有自己的專有功能以及獨特的API。有些API很好,有些則不太好。實際上,好的和不太好的RTOS
    發(fā)表于 05-30 11:08 ?305次閱讀
    主站蜘蛛池模板: 欧美特级午夜一区二区三区 | 精品日韩视频 | 色综合色综合久久综合频道 | 日韩AV片无码一区二区三区不卡 | 伊人久久综合网站 | 国产亚洲国际精品福利 | 色多多污污版免费下载安装 | 中文日产无乱码AV在线观 | 在线 国产 欧美 专区 | 亚洲免费网站在线观看 | bl撅高扒开臀缝哦 | 麻豆国产人妻欲求不满 | 性奴公司 警花 | 国产亚洲精品影视在线 | 欧洲日韩av无线在码 | 亚洲色婷婷久久精品AV蜜桃久久 | 性高跟鞋xxxxhd | 不分昼夜H1V3 | 国产99r视频精品免费观看 | 久久人妻少妇嫩草AV蜜桃99 | 色橹 | 国产综合无码一区二区色蜜蜜 | 在线精彩视频在线观看免费 | yellow在线观看免费观看大全 | 东北足疗店妓女在线观看 | 相声flash| 国产69精品久久久久无码麻豆 | 飘雪韩国在线观看免费高清完整版 | 日本一卡二卡三卡四卡无卡免费播放 | 日本日本熟妇中文在线视频 | 伊人久久网国产伊人 | 国产精品97久久久久久AV色戒 | 超级最爽的乱淫片免费 | 欧美日韩午夜群交多人轮换 | 午夜影院老司机 | 久久99精国产一区二区三区四区 | 二级特黄绝大片免费视频大片 | 无限资源在线观看完整版免费下载 | 日韩欧美国产免费看清风阁 | 2022精品福利在线小视频 | 爽爽影院免费观看 |