這是32單片機ucosiii一部分源碼
0.png (11.01 KB, 下載次數: 43)
下載附件
2018-8-16 02:47 上傳
所有資料51hei提供下載:
2-ucosiii例程.7z
(1.18 MB, 下載次數: 89)
2023-8-3 00:01 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
其中一個單片機源程序如下:
- /*
- *********************************************************************************************************
- * EXAMPLE CODE
- *
- * (c) Copyright 2013; Micrium, Inc.; Weston, FL
- *
- * All rights reserved. Protected by international copyright laws.
- * Knowledge of the source code may not be used to write a similar
- * product. This file may only be used in accordance with a license
- * and should not be redistributed in any way.
- *********************************************************************************************************
- */
- /*
- *********************************************************************************************************
- *
- * EXAMPLE CODE
- *
- * IAR Development Kits
- * on the
- *
- * STM32F429II-SK KICKSTART KIT
- *
- * Filename : app.c
- * Version : V1.00
- * Programmer(s) : YS
- * DC
- *********************************************************************************************************
- */
- /*
- *********************************************************************************************************
- * INCLUDE FILES
- *********************************************************************************************************
- */
- #include <includes.h>
- /*
- *********************************************************************************************************
- * LOCAL DEFINES
- *********************************************************************************************************
- */
- OS_SEM SemOfKey; //標志KEY1是否被單擊的多值信號量
- /*
- *********************************************************************************************************
- * TCB
- *********************************************************************************************************
- */
- static OS_TCB AppTaskStartTCB; //任務控制塊
- static OS_TCB AppTaskKeyTCB;
- static OS_TCB AppTaskLed1TCB;
- /*
- *********************************************************************************************************
- * STACKS
- *********************************************************************************************************
- */
- static CPU_STK AppTaskStartStk[APP_TASK_START_STK_SIZE]; //任務堆棧
- static CPU_STK AppTaskKeyStk [ APP_TASK_KEY_STK_SIZE ];
- static CPU_STK AppTaskLed1Stk [ APP_TASK_LED1_STK_SIZE ];
- /*
- *********************************************************************************************************
- * FUNCTION PROTOTYPES
- *********************************************************************************************************
- */
- static void AppTaskStart (void *p_arg); //任務函數聲明
- static void AppTaskKey ( void * p_arg );
- static void AppTaskLed1 ( 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
- /* 創建起始任務 */
- OSTaskCreate((OS_TCB *)&AppTaskStartTCB, //任務控制塊地址
- (CPU_CHAR *)"App Task Start", //任務名稱
- (OS_TASK_PTR ) AppTaskStart, //任務函數
- (void *) 0, //傳遞給任務函數(形參p_arg)的實參
- (OS_PRIO ) APP_TASK_START_PRIO, //任務的優先級
- (CPU_STK *)&AppTaskStartStk[0], //任務堆棧的基地址
- (CPU_STK_SIZE) APP_TASK_START_STK_SIZE / 10, //任務堆棧空間剩下1/10時限制其增長
- (CPU_STK_SIZE) APP_TASK_START_STK_SIZE, //任務堆棧空間(單位:sizeof(CPU_STK))
- (OS_MSG_QTY ) 5u, //任務可接收的最大消息數
- (OS_TICK ) 0u, //任務的時間片節拍數(0表默認值OSCfg_TickRate_Hz/10)
- (void *) 0, //任務擴展(0表不擴展)
- (OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR), //任務選項
- (OS_ERR *)&err); //返回錯誤類型
- OSStart(&err); //啟動多任務管理(交由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 組件(時間戳、關中斷時間測量和主機名)
- cpu_clk_freq = BSP_CPU_ClkFreq(); //獲取 CPU 內核時鐘頻率(SysTick 工作時鐘)
- cnts = cpu_clk_freq / (CPU_INT32U)OSCfg_TickRate_Hz; //根據用戶設定的時鐘節拍頻率計算 SysTick 定時器的計數值
- OS_CPU_SysTickInit(cnts); //調用 SysTick 初始化函數,設置定時器計數值和啟動定時器
- Mem_Init(); //初始化內存管理組件(堆內存池和內存池表)
- #if OS_CFG_STAT_TASK_EN > 0u //如果使能(默認使能)了統計任務
- OSStatTaskCPUUsageInit(&err); //計算沒有應用任務(只有空閑任務)運行時 CPU 的(最大)
- #endif //容量(決定 OS_Stat_IdleCtrMax 的值,為后面計算 CPU
- //使用率使用)。
- #ifdef CPU_CFG_INT_DIS_MEAS_EN
- CPU_IntDisMeasMaxCurReset(); //復位(清零)當前最大關中斷時間
- #endif
-
- /* 創建多值信號量 SemOfKey */
- OSSemCreate((OS_SEM *)&SemOfKey, //指向信號量變量的指針
- (CPU_CHAR *)"SemOfKey", //信號量的名字
- (OS_SEM_CTR )0, //信號量這里是指示事件發生,所以賦值為0,表示事件還沒有發生
- (OS_ERR *)&err); //錯誤類型
-
- /* 創建 AppTaskKey 任務 */
- OSTaskCreate((OS_TCB *)&AppTaskKeyTCB, //任務控制塊地址
- (CPU_CHAR *)"App Task Key", //任務名稱
- (OS_TASK_PTR ) AppTaskKey, //任務函數
- (void *) 0, //傳遞給任務函數(形參p_arg)的實參
- (OS_PRIO ) APP_TASK_KEY_PRIO, //任務的優先級
- (CPU_STK *)&AppTaskKeyStk[0], //任務堆棧的基地址
- (CPU_STK_SIZE) APP_TASK_KEY_STK_SIZE / 10, //任務堆棧空間剩下1/10時限制其增長
- (CPU_STK_SIZE) APP_TASK_KEY_STK_SIZE, //任務堆棧空間(單位:sizeof(CPU_STK))
- (OS_MSG_QTY ) 5u, //任務可接收的最大消息數
- (OS_TICK ) 0u, //任務的時間片節拍數(0表默認值OSCfg_TickRate_Hz/10)
- (void *) 0, //任務擴展(0表不擴展)
- (OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR), //任務選項
- (OS_ERR *)&err); //返回錯誤類型
-
- /* 創建 LED1 任務 */
- OSTaskCreate((OS_TCB *)&AppTaskLed1TCB, //任務控制塊地址
- (CPU_CHAR *)"App Task Led1", //任務名稱
- (OS_TASK_PTR ) AppTaskLed1, //任務函數
- (void *) 0, //傳遞給任務函數(形參p_arg)的實參
- (OS_PRIO ) APP_TASK_LED1_PRIO, //任務的優先級
- (CPU_STK *)&AppTaskLed1Stk[0], //任務堆棧的基地址
- (CPU_STK_SIZE) APP_TASK_LED1_STK_SIZE / 10, //任務堆棧空間剩下1/10時限制其增長
- (CPU_STK_SIZE) APP_TASK_LED1_STK_SIZE, //任務堆棧空間(單位:sizeof(CPU_STK))
- (OS_MSG_QTY ) 5u, //任務可接收的最大消息數
- (OS_TICK ) 0u, //任務的時間片節拍數(0表默認值OSCfg_TickRate_Hz/10)
- (void *) 0, //任務擴展(0表不擴展)
- (OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR), //任務選項
- (OS_ERR *)&err); //返回錯誤類型
-
- OSTaskDel ( & AppTaskStartTCB, & err ); //刪除起始任務本身,該任務不再運行
-
-
- }
- /*
- *********************************************************************************************************
- * KEY TASK
- *********************************************************************************************************
- */
- static void AppTaskKey ( void * p_arg )
- {
- OS_ERR err;
- uint8_t ucKey1Press = 0;
-
-
- (void)p_arg;
-
- while (DEF_TRUE) { //任務體
- if( Key_Scan ( macKEY1_GPIO_PORT, macKEY1_GPIO_PIN, 1, & ucKey1Press ) ) //如果KEY1被單擊
- OSSemPost((OS_SEM *)&SemOfKey, //發布SemOfKey
- (OS_OPT )OS_OPT_POST_ALL, //發布給所有等待任務
- (OS_ERR *)&err); //返回錯誤類型
- OSTimeDlyHMSM ( 0, 0, 0, 20, OS_OPT_TIME_DLY, & err ); //每20ms掃描一次
-
- }
-
- }
- /*
- *********************************************************************************************************
- * LED1 TASK
- *********************************************************************************************************
- */
- static void AppTaskLed1 ( void * p_arg )
- {
- OS_ERR err;
- CPU_INT32U cpu_clk_freq;
- CPU_TS ts_sem_post, ts_sem_get;
- CPU_SR_ALLOC(); //使用到臨界段(在關/開中斷時)時必需該宏,該宏聲明和定義一個局部變
- //量,用于保存關中斷前的 CPU 狀態寄存器 SR(臨界段關中斷只需保存SR)
- //,開中斷時將該值還原。
- (void)p_arg;
- cpu_clk_freq = BSP_CPU_ClkFreq(); //獲取CPU時鐘,時間戳是以該時鐘計數
-
-
- while (DEF_TRUE) { //任務體
-
- OSSemPend ((OS_SEM *)&SemOfKey, //等待該信號量被發布
- (OS_TICK )0, //無期限等待
- (OS_OPT )OS_OPT_PEND_BLOCKING, //如果沒有信號量可用就等待
- (CPU_TS *)&ts_sem_post, //獲取信號量最后一次被發布的時間戳
- (OS_ERR *)&err); //返回錯誤類型
-
- ts_sem_get = OS_TS_GET(); //獲取解除等待時的時間戳
-
- macLED1_TOGGLE (); //切換LED1的亮滅狀態
-
- OS_CRITICAL_ENTER(); //進入臨界段,不希望下面串口打印遭到中斷
-
- printf ( "\r\n發布信號量的時間戳是%d", ts_sem_post );
- printf ( "\r\n解除等待狀態的時間戳是%d", ts_sem_get );
- printf ( "\r\n接收到信號量與發布信號量的時間相差%dus\r\n",
- ( ts_sem_get - ts_sem_post ) / ( cpu_clk_freq / 1000000 ) );
-
- OS_CRITICAL_EXIT();
- }
-
-
- }
復制代碼
|