|
ucos iii例程
0.png (48.67 KB, 下載次數(shù): 49)
下載附件
2018-5-14 23:17 上傳
所有資料51hei提供下載:
3.ucosiii例程.zip
(12.21 MB, 下載次數(shù): 87)
2018-5-14 10:46 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
源碼列表:
0. STM32 裸機(jī)程序
1. 官方 uCOS-III 源碼
10.等待多個(gè)內(nèi)核對象
11.任務(wù)信號量
12.任務(wù)消息隊(duì)列
13.內(nèi)存管理
14.任務(wù)管理
15.中斷管理
16.各類統(tǒng)計(jì)信息
2. 移植 uCOS-III 到 STM32
3. 時(shí)鐘節(jié)拍
4. 時(shí)間管理
5. 軟件定時(shí)器
6.多值信號量
7.互斥信號量
8.消息隊(duì)列
9.事件標(biāo)志組
單片機(jī)源程序如下:
- /*
- *********************************************************************************************************
- * EXAMPLE CODE
- *
- * (c) Copyright 2003-2013; Micrium, Inc.; Weston, FL
- *
- * All rights reserved. Protected by international copyright laws.
- * Knowledge of the source code may NOT be used to develop a similar product.
- * Please help us continue to provide the Embedded community with the finest
- * software available. Your honesty is greatly appreciated.
- *********************************************************************************************************
- */
- /*
- *********************************************************************************************************
- *
- * EXAMPLE CODE
- *
- * ST Microelectronics STM32
- * on the
- *
- * Micrium uC-Eval-STM32F107
- * Evaluation Board
- *
- * Filename : app.c
- * Version : V1.00
- * Programmer(s) : EHS
- * DC
- *********************************************************************************************************
- */
- /*
- *********************************************************************************************************
- * INCLUDE FILES
- *********************************************************************************************************
- */
- #include <includes.h>
- /*
- *********************************************************************************************************
- * LOCAL DEFINES
- *********************************************************************************************************
- */
- OS_MUTEX mutex; //聲明互斥信號量
- uint8_t ucValue [ 2 ] = { 0x00, 0x00 };
- /*
- *********************************************************************************************************
- * TCB
- *********************************************************************************************************
- */
- static OS_TCB AppTaskStartTCB; //任務(wù)控制塊
- static OS_TCB AppTaskWriteTCB;
- static OS_TCB AppTaskReadTCB;
- /*
- *********************************************************************************************************
- * STACKS
- *********************************************************************************************************
- */
- static CPU_STK AppTaskStartStk[APP_TASK_START_STK_SIZE]; //任務(wù)堆棧
- static CPU_STK AppTaskWriteStk [ APP_TASK_WRITE_STK_SIZE ];
- static CPU_STK AppTaskReadStk [ APP_TASK_READ_STK_SIZE ];
- /*
- *********************************************************************************************************
- * FUNCTION PROTOTYPES
- *********************************************************************************************************
- */
- static void AppTaskStart (void *p_arg); //任務(wù)函數(shù)聲明
- static void AppTaskWrite ( void * p_arg );
- static void AppTaskRead ( void * p_arg );
- /*
- *********************************************************************************************************
- * main()
- *
- * Description : This is the standard entry point for C code. It is assumed that your code will call
- * main() once you have performed all necessary initialization.
- *
- * Arguments : none
- *
- * Returns : none
- *********************************************************************************************************
- */
- int main (void)
- {
- OS_ERR err;
- OSInit(&err); //初始化 uC/OS-III
- /* 創(chuàng)建起始任務(wù) */
- OSTaskCreate((OS_TCB *)&AppTaskStartTCB, //任務(wù)控制塊地址
- (CPU_CHAR *)"App Task Start", //任務(wù)名稱
- (OS_TASK_PTR ) AppTaskStart, //任務(wù)函數(shù)
- (void *) 0, //傳遞給任務(wù)函數(shù)(形參p_arg)的實(shí)參
- (OS_PRIO ) APP_TASK_START_PRIO, //任務(wù)的優(yōu)先級
- (CPU_STK *)&AppTaskStartStk[0], //任務(wù)堆棧的基地址
- (CPU_STK_SIZE) APP_TASK_START_STK_SIZE / 10, //任務(wù)堆?臻g剩下1/10時(shí)限制其增長
- (CPU_STK_SIZE) APP_TASK_START_STK_SIZE, //任務(wù)堆?臻g(單位:sizeof(CPU_STK))
- (OS_MSG_QTY ) 5u, //任務(wù)可接收的最大消息數(shù)
- (OS_TICK ) 0u, //任務(wù)的時(shí)間片節(jié)拍數(shù)(0表默認(rèn)值OSCfg_TickRate_Hz/10)
- (void *) 0, //任務(wù)擴(kuò)展(0表不擴(kuò)展)
- (OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR), //任務(wù)選項(xiàng)
- (OS_ERR *)&err); //返回錯(cuò)誤類型
- OSStart(&err); //啟動(dòng)多任務(wù)管理(交由uC/OS-III控制)
- }
- /*
- *********************************************************************************************************
- * STARTUP TASK
- *
- * Description : This is an example of a startup task. As mentioned in the book's text, you MUST
- * initialize the ticker only once multitasking has started.
- *
- * Arguments : p_arg is the argument passed to 'AppTaskStart()' by 'OSTaskCreate()'.
- *
- * Returns : none
- *
- * Notes : 1) The first line of code is used to prevent a compiler warning because 'p_arg' is not
- * used. The compiler should not generate any code for this statement.
- *********************************************************************************************************
- */
- static void AppTaskStart (void *p_arg)
- {
- CPU_INT32U cpu_clk_freq;
- CPU_INT32U cnts;
- OS_ERR err;
- (void)p_arg;
- BSP_Init(); //板級初始化
- CPU_Init(); //初始化 CPU 組件(時(shí)間戳、關(guān)中斷時(shí)間測量和主機(jī)名)
- cpu_clk_freq = BSP_CPU_ClkFreq(); //獲取 CPU 內(nèi)核時(shí)鐘頻率(SysTick 工作時(shí)鐘)
- cnts = cpu_clk_freq / (CPU_INT32U)OSCfg_TickRate_Hz; //根據(jù)用戶設(shè)定的時(shí)鐘節(jié)拍頻率計(jì)算 SysTick 定時(shí)器的計(jì)數(shù)值
- OS_CPU_SysTickInit(cnts); //調(diào)用 SysTick 初始化函數(shù),設(shè)置定時(shí)器計(jì)數(shù)值和啟動(dòng)定時(shí)器
- Mem_Init(); //初始化內(nèi)存管理組件(堆內(nèi)存池和內(nèi)存池表)
- #if OS_CFG_STAT_TASK_EN > 0u //如果使能(默認(rèn)使能)了統(tǒng)計(jì)任務(wù)
- OSStatTaskCPUUsageInit(&err); //計(jì)算沒有應(yīng)用任務(wù)(只有空閑任務(wù))運(yùn)行時(shí) CPU 的(最大)
- #endif //容量(決定 OS_Stat_IdleCtrMax 的值,為后面計(jì)算 CPU
- //使用率使用)。
- CPU_IntDisMeasMaxCurReset(); //復(fù)位(清零)當(dāng)前最大關(guān)中斷時(shí)間
-
- /* 創(chuàng)建互斥信號量 mutex */
- OSMutexCreate ((OS_MUTEX *)&mutex, //指向信號量變量的指針
- (CPU_CHAR *)"Mutex For Test", //信號量的名字
- (OS_ERR *)&err); //錯(cuò)誤類型
-
- /* 創(chuàng)建 AppTaskWrite 任務(wù) */
- OSTaskCreate((OS_TCB *)&AppTaskWriteTCB, //任務(wù)控制塊地址
- (CPU_CHAR *)"App Task Write", //任務(wù)名稱
- (OS_TASK_PTR ) AppTaskWrite, //任務(wù)函數(shù)
- (void *) 0, //傳遞給任務(wù)函數(shù)(形參p_arg)的實(shí)參
- (OS_PRIO ) APP_TASK_WRITE_PRIO, //任務(wù)的優(yōu)先級
- (CPU_STK *)&AppTaskWriteStk[0], //任務(wù)堆棧的基地址
- (CPU_STK_SIZE) APP_TASK_WRITE_STK_SIZE / 10, //任務(wù)堆?臻g剩下1/10時(shí)限制其增長
- (CPU_STK_SIZE) APP_TASK_WRITE_STK_SIZE, //任務(wù)堆棧空間(單位:sizeof(CPU_STK))
- (OS_MSG_QTY ) 5u, //任務(wù)可接收的最大消息數(shù)
- (OS_TICK ) 0u, //任務(wù)的時(shí)間片節(jié)拍數(shù)(0表默認(rèn)值OSCfg_TickRate_Hz/10)
- (void *) 0, //任務(wù)擴(kuò)展(0表不擴(kuò)展)
- (OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR), //任務(wù)選項(xiàng)
- (OS_ERR *)&err); //返回錯(cuò)誤類型
- /* 創(chuàng)建 AppTaskRead 任務(wù) */
- OSTaskCreate((OS_TCB *)&AppTaskReadTCB, //任務(wù)控制塊地址
- (CPU_CHAR *)"App Task Read", //任務(wù)名稱
- (OS_TASK_PTR ) AppTaskRead, //任務(wù)函數(shù)
- (void *) 0, //傳遞給任務(wù)函數(shù)(形參p_arg)的實(shí)參
- (OS_PRIO ) APP_TASK_READ_PRIO, //任務(wù)的優(yōu)先級
- (CPU_STK *)&AppTaskReadStk[0], //任務(wù)堆棧的基地址
- (CPU_STK_SIZE) APP_TASK_READ_STK_SIZE / 10, //任務(wù)堆?臻g剩下1/10時(shí)限制其增長
- (CPU_STK_SIZE) APP_TASK_READ_STK_SIZE, //任務(wù)堆?臻g(單位:sizeof(CPU_STK))
- (OS_MSG_QTY ) 5u, //任務(wù)可接收的最大消息數(shù)
- (OS_TICK ) 0u, //任務(wù)的時(shí)間片節(jié)拍數(shù)(0表默認(rèn)值OSCfg_TickRate_Hz/10)
- (void *) 0, //任務(wù)擴(kuò)展(0表不擴(kuò)展)
- (OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR), //任務(wù)選項(xiàng)
- (OS_ERR *)&err); //返回錯(cuò)誤類型
-
- OSTaskDel ( & AppTaskStartTCB, & err ); //刪除起始任務(wù)本身,該任務(wù)不再運(yùn)行
-
-
- }
- /*
- *********************************************************************************************************
- * WRITE TASK
- *********************************************************************************************************
- */
- static void AppTaskWrite ( void * p_arg )
- {
- OS_ERR err;
-
- (void)p_arg;
-
- while (DEF_TRUE) { //任務(wù)體
- OSMutexPend ((OS_MUTEX *)&mutex, //申請互斥信號量 mutex
- (OS_TICK )0, //無期限等待
- (OS_OPT )OS_OPT_PEND_BLOCKING, //如果不能申請到信號量就堵塞任務(wù)
- (CPU_TS *)0, //不想獲得時(shí)間戳
- (OS_ERR *)&err); //返回錯(cuò)誤類型
-
- ucValue [ 0 ] ++;
-
- OSTimeDly ( 100, OS_OPT_TIME_DLY, & err ); //延時(shí)100個(gè)時(shí)鐘節(jié)拍(100ms)
-
- ucValue [ 1 ] ++;
-
- OSMutexPost ((OS_MUTEX *)&mutex, //釋放互斥信號量 mutex
- (OS_OPT )OS_OPT_POST_NONE, //進(jìn)行任務(wù)調(diào)度
- (OS_ERR *)&err); //返回錯(cuò)誤類型
-
- }
- }
- /*
- *********************************************************************************************************
- * READ TASK
- *********************************************************************************************************
- */
- static void AppTaskRead ( void * p_arg )
- {
- OS_ERR err;
- CPU_SR_ALLOC(); //使用到臨界段(在關(guān)/開中斷時(shí))時(shí)必需該宏,該宏聲明和
- //定義一個(gè)局部變量,用于保存關(guān)中斷前的 CPU 狀態(tài)寄存器
- // SR(臨界段關(guān)中斷只需保存SR),開中斷時(shí)將該值還原。
- (void)p_arg;
-
- while (DEF_TRUE) { //任務(wù)體
- OSMutexPend ((OS_MUTEX *)&mutex, //申請互斥信號量 mutex
- (OS_TICK )0, //無期限等待
- (OS_OPT )OS_OPT_PEND_BLOCKING, //如果申請不到就堵塞任務(wù)
- (CPU_TS *)0, //不想獲得時(shí)間戳
- (OS_ERR *)&err); //返回錯(cuò)誤類型
-
- if ( ucValue [ 0 ] == ucValue [ 1 ] )
- {
- OS_CRITICAL_ENTER(); //進(jìn)入臨界段
-
- printf ( "\r\nSUCCESSFUL\r\n" );
-
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼 |
|