1. 程式人生 > >UCOSIII 內建訊息佇列

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