UCOSIII 內建訊息佇列
一、相關理論
1、如同訊號量一樣,UCOSIII也可以任務內建訊息佇列,不僅簡化了程式,還提升了效率。
2、使用訊息佇列需開啟巨集 OS_CFG_TASK_Q_EN
3、使用訊息佇列,建立任務時需設定內建訊息佇列的大小
如 :(OS_MSG_QTY) 2,
二、相關API函式
1、OSTaskQPend() 等待內建訊息佇列
u8 *num;
num=OSTaskQPend( 0, OS_OPT_PEND_BLOCKING , &size, NULL, &err);
void *OSTaskQPend (OS_TICK timeout, //超時等待時間
OS_OPT opt, //是否使用阻塞
OS_MSG_SIZE *p_msg_size, //指向存放大小變數
CPU_TS *p_ts, //時間戳
OS_ERR *p_err)
2、OSTaskQPost () 傳送內建訊息佇列
OSTaskQPost ( &Task2TaskTCB, &Tmr_num, 10, OS_OPT_POST_FIFO, &err);
void OSTaskQPost (OS_TCB *p_tcb, //指向訊息要傳送的任務塊
void *p_void, //要傳送的資料指標
OS_MSG_SIZE msg_size, //傳送資料大小
OS_OPT opt, //傳送操作型別選項
OS_ERR *p_err)
OS_OPT opt OS_OPT_POST_FIFO //先進先出
OS_OPT_POST_LIFO //先進後出
OS_OPT_POST_NO_SCHED //傳送後不進行任務排程
選項可以作|操作
三、實驗設計
1、設計一個程式,包含3個任務,一個定時器。
2、任務1用於開啟和關閉定時器。
3、定時器回撥函式,通過內建訊息佇列向任務2傳送定時器執行次數。
4、任務2向串列埠列印相關函式
四、程式原始碼
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "bsp_key.h"
#include "usart.h"
#include "includes.h"
//任務優先順序
#define START_TASK_PRIO 3
//任務堆疊大小
#define START_STK_SIZE 128
//任務控制塊
OS_TCB StartTaskTCB;
//任務堆疊
CPU_STK START_TASK_STK[START_STK_SIZE];
//任務函式
void start_task(void *p_arg);
//任務優先順序
#define TASK1_TASK_PRIO 4
//任務堆疊大小
#define TASK1_STK_SIZE 128
//任務控制塊
OS_TCB Task1TaskTCB;
//任務堆疊
CPU_STK TASK1_TASK_STK[TASK1_STK_SIZE];
//任務函式
void task1_task(void *p_arg);
//任務優先順序
#define TASK2_TASK_PRIO 5
//任務堆疊大小
#define TASK2_STK_SIZE 128
//任務控制塊
OS_TCB Task2TaskTCB;
//任務堆疊
CPU_STK TASK2_TASK_STK[TASK2_STK_SIZE];
//任務函式
void task2_task(void *p_arg);
#define TASK_Q_NUM 4
OS_TMR tmr1;
u8 task1_num=0;
u8 Tmr_num=0;
void tmr1_callback(void);
int main(void)
{
OS_ERR err;
CPU_SR_ALLOC();
delay_init ();
NVIC_PriorityGroupConfig (NVIC_PriorityGroup_2); //設定中斷優先順序
uart_init (115200); //初始化串列埠
printf("串列埠初始化完成\r\n");
LED_Init();
Key_GPIO_Config();
OSInit(&err);
OS_CRITICAL_ENTER(); //進入臨界區
OSTaskCreate( (OS_TCB*) &StartTaskTCB, //任務控制塊
(CPU_CHAR*) "start_task ", //任務名稱
(OS_TASK_PTR) start_task, //任務函式
(void*) 0, //引數
(OS_PRIO) START_TASK_PRIO, //任務優先順序
(CPU_STK*) &START_TASK_STK[0], //任務堆疊基地址
(CPU_STK_SIZE) START_STK_SIZE/10, //任務堆疊深度限位
(CPU_STK_SIZE) START_STK_SIZE, //任務堆疊大小
(OS_MSG_QTY) 0, //任務內部訊息佇列能夠接收的最大訊息數目,為0時禁止接收訊息
(OS_TICK) 0 //當使能時間片輪轉時的時間片長度,為0時為預設長度
(void*) 0, //使用者補充的儲存區
(OS_OPT) OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //任務選項
(OS_ERR*) &err); //存放該函式錯誤時的返回值
OS_CRITICAL_EXIT(); //退出臨界區
OSStart(&err);
}
//開始任務函式
void start_task(void *p_arg)
{
OS_ERR err;
CPU_SR_ALLOC();
p_arg = p_arg;
CPU_Init();
#if OS_CFG_STAT_TASK_EN > 0u
OSStatTaskCPUUsageInit(&err); //統計任務
#endif
#ifdef CPU_CFG_INT_DIS_MEAS_EN //如果使能了測量中斷關閉時間
CPU_IntDisMeasMaxCurReset();
#endif
#if OS_CFG_SCHED_ROUND_ROBIN_EN //當使用時間片輪轉的時候
//使能時間片輪轉排程功能,時間片長度為1個系統時鐘節拍,既1*5=5ms
OSSchedRoundRobinCfg(DEF_ENABLED,1,&err);
#endif
OS_CRITICAL_ENTER(); //進入臨界區
OSTmrCreate ( (OS_TMR*) &tmr1,
(CPU_CHAR*) "tmr1",
(OS_TICK ) 0, //初始化延時20*10=200ms
(OS_TICK) 200, // 100*10=1000ms
(OS_OPT) OS_OPT_TMR_PERIODIC,
(OS_TMR_CALLBACK_PTR) tmr1_callback,
(void*) 0,
(OS_ERR*) &err);
OSTaskCreate( (OS_TCB*) &Task1TaskTCB, //任務控制塊
(CPU_CHAR*) "task1_task ", //任務名稱
(OS_TASK_PTR) task1_task, //任務函式
(void*) 0, //引數
(OS_PRIO) TASK1_TASK_PRIO, //任務優先順序
(CPU_STK*) &TASK1_TASK_STK[0],
(CPU_STK_SIZE) TASK1_STK_SIZE/10,
(CPU_STK_SIZE) TASK1_STK_SIZE,
(OS_MSG_QTY) 0,
(OS_TICK) 0,
(void*) 0,
(OS_OPT) OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
(OS_ERR*) &err);
OSTaskCreate( (OS_TCB*) &Task2TaskTCB, //任務控制塊
(CPU_CHAR*) "task2_task ", //任務名稱
(OS_TASK_PTR) task2_task, //任務函式
(void*) 0, //引數
(OS_PRIO) TASK2_TASK_PRIO, //任務優先順序
(CPU_STK*) &TASK2_TASK_STK[0],
(CPU_STK_SIZE) TASK2_STK_SIZE/10,
(CPU_STK_SIZE) TASK2_STK_SIZE,
(OS_MSG_QTY) 2, //內建訊息佇列長度
(OS_TICK) 0,
(void*) 0,
(OS_OPT) OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
(OS_ERR*) &err);
OS_CRITICAL_EXIT(); //退出臨界區
OSTaskDel ((OS_TCB*)&StartTaskTCB,&err); //刪除任務自身
}
void task1_task(void *p_arg)
{
OS_ERR err;
CPU_SR_ALLOC();
p_arg = p_arg;
while(1)
{
if(PAin(0)==1)
{
task1_num++; //按鍵次數
if(task1_num%2==0)
{
OSTmrStop (&tmr1, OS_OPT_TMR_NONE, 0,&err);
printf("關閉定時器1\r\n");
}
else
{
OSTmrStart (&tmr1,&err);
printf("開啟定時器1\r\n");
}
while(PAin(0)==1);
}
OSTimeDlyHMSM(0,0,0,10,OS_OPT_TIME_HMSM_STRICT,&err); //延時10MS
}
}
void task2_task(void *p_arg)
{
u8 *num;
OS_ERR err;
CPU_SR_ALLOC();
OS_MSG_SIZE size;
p_arg = p_arg;
while(1)
{
num=OSTaskQPend( 0, OS_OPT_PEND_BLOCKING , &size, NULL, &err);
printf("回撥次數 %d\r\n",*num);
LED1=~LED1;
OSTimeDlyHMSM(0,0,0,800,OS_OPT_PEND_BLOCKING,&err); //延時800MS
}
}
void tmr1_callback(void)
{
OS_ERR err;
Tmr_num++;
OSTaskQPost ( &Task2TaskTCB, &Tmr_num, 10, OS_OPT_POST_FIFO, &err);
// LED1=~LED1;
}
相關推薦
UCOSIII 內建訊息佇列
一、相關理論 1、如同訊號量一樣,UCOSIII也可以任務內建訊息佇列,不僅簡化了程式,還提升了效率。 2、使用訊息佇列需開啟巨集 OS_CFG_TASK_Q_EN 3、使用訊息佇列,建立任務時需設定內建訊息佇列的大小 如 :(OS_MSG_QTY) 2,
ucosiii任務內建訊息佇列
1 //串列埠1中斷處理程式 2 void USART1_IRQHandler(void) //串列埠1中斷服務程式 3 { 4 OS_ERR err; 5 OSIntEnter(); //通知UCOS進入中斷 6 //傳送
uCosIII之訊息佇列與記憶體管理
#define TX_MSG_MEM_BLK_NUM 30 //記憶體分割槽的記憶體塊數量 #define TX_MSG_MEM_BLK_SIZE 60 //記憶體分割槽的記憶體塊大小 #define TX_MSG_QUEUE_SIZE
零基礎學python-4.2 其它內建類型
介紹 src one 一個 tex == water 文件 div 這一章節我們來聊聊其它內建類型 1.類型type 在python2.2的時候,type是通過字符串實現的,再後來才把類型和類統一 我們再次使用上一章節的圖片來說明一些問題 我們通
【函數】isinstance內建函數(小窗help)
是否 clas dict 百度 .com text 子類 als float #學到了第八天,還有很多沒有理解,不過,沒關系,相信任何復雜的問題都是由簡單的組成,只有將每一個細節理解到位,自然問題迎刃而解 今天遇到了isinstace函數,忘了,先看一下語法 查百度附上鏈接
python中內建函數isinstance的用法
pytho class cnblogs 這樣的 一個 blog object font 元組 isinstance:Python中的一個內建函數 語法: isinstance(object, classinfo) 1、如果參數object是classinfo的實例,
筆記:MyBatis XML配置-typeAliases 內建別名表
short batis big int arraylist spa myba bottom one 別名 映射的類型 _byte byte _long long _short short _int int _integer int _double double _float
Linux內建函數
內建函數hex() 10進制轉為16進制oct() 10進制轉8bin() 10轉2ord() 字符轉asciichr() ascii轉字符decimal 金融型 計算模塊list() 把可叠代對象轉為列表str() 把obj對象轉換成字符串tuple() 把可叠代對象轉換成一個元組對象len(se
python中經常使用的字典內建函數
哈希 popu blog default app ping 復制 none you 1、len(mapping) 返回映射的長度(鍵-值對的個數) 2、hash(obj) 返回o
轉義字符,格式化符號和內建函數
小數點 com api table 它的 backspace for 字母 宋體 轉義字符描述 \(在行尾時) 續行符 \\ 反斜杠符號 \‘ 單引號 \" 雙引號 \a 響鈴 \b 退格(Backspace) \e 轉義 \000 空
字符串的內建函數
是否 echars end 開頭 -1 false 檢測 str2 sta Python 的字符串內建函數 Python 的字符串常用內建函數如下: 序號方法及描述 1 capitalize()將字符串的第一個字符轉換為大寫 2 center(wi
Python globals() locals() vars() 三個內建函數的區別
https 聲明 usr object index 函數 targe outer ref 首先參考官方文檔對這三個函數的介紹: 2. Built-in Functions – Python3.5 1、globals() 返回當前全局符號表, 通常是返回當前模塊下的全局符號表
python內建函數
call src print true bool nco cnblogs color 都是 #abs 求絕對值 print(abs(-1)) #all #判斷函數內部的布爾值,如果都是Trun則返回true #空是True print(all([1,2,‘a‘,Non
(轉)論python工廠函數與內建函數
符號 靜態 iss == hex 功能 小寫 生產 find() 所謂工廠函數就是指這些內建函數都是類對象, 當你調用它們時,實際上是創建了一個類實例。 工廠函數: int(),long(),float(),complex(),bool() str(),unicode(
Pyhont:內建函數enumerate
ima 返回值 文件 images 讀取文件行 for 中文意思 9.png http 1、enumerate的中文意思 2、enumerate參數為可遍歷的變量,如字符串、列表等,其返回值為enumerate類。 3、enumerate多用在for循環中得到計數 。
js 內建函數reduce
return urn turn 如果 數字 function 乘除 llb bsp 今天發現js的一個內建函數reduce,還是挺有意思的,寫一下我認為比較有意思的部分 1. reduce經常用於數組的疊加, 他會接受兩個參數,第一個是毀掉函數callback(),第二個
mongodb內建角色
集群 ada mongodb base img images ref mage manager MongoDB內建角色 數據庫用戶角色:read、readWrite; 數據庫管理角色:dbAdmin、dbOwner、userAdmin; 集群管理角色:clusterAdm
字符串類型內建方法歸納總結
內建函數版本:python3.6在查看bulitins的內建函數時,對字符串的內建方法進行了分類總結。類別 方法描述示例查找string.find(sub, start=None, end=None)在指定的範圍內查找子串,找到則返回最小的index;未找到則返回-1mystr = ‘hello world
python列表解析式,生成器,及部分內建函數使用方法
法國 set mime 惰性 ring pla ges 函數 calendar 標準庫datetime 需要導入datetime模塊: import datetime datetime模塊: 對日期,時間,時間戳的處理 datetime的類方法
python range()內建函數
pythonrange()內建函數>>> for i in range(5): print(i) 01234>>> for i in range(2, 8): print(i) 234567>>> for i in range(1, 10, 3): pri