欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標(biāo)題:
stm32單片機(jī)ucosiii例程分享
[打印本頁]
作者:
6664485
時間:
2018-8-15 09:23
標(biāo)題:
stm32單片機(jī)ucosiii例程分享
這是32單片機(jī)ucosiii一部分源碼
0.png
(11.01 KB, 下載次數(shù): 43)
下載附件
2018-8-16 02:47 上傳
所有資料51hei提供下載:
2-ucosiii例程.7z
(1.18 MB, 下載次數(shù): 89)
2023-8-3 00:01 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
其中一個單片機(jī)源程序如下:
/*
*********************************************************************************************************
* 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; //標(biāo)志KEY1是否被單擊的多值信號量
/*
*********************************************************************************************************
* TCB
*********************************************************************************************************
*/
static OS_TCB AppTaskStartTCB; //任務(wù)控制塊
static OS_TCB AppTaskKeyTCB;
static OS_TCB AppTaskLed1TCB;
/*
*********************************************************************************************************
* STACKS
*********************************************************************************************************
*/
static CPU_STK AppTaskStartStk[APP_TASK_START_STK_SIZE]; //任務(wù)堆棧
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); //任務(wù)函數(shù)聲明
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
/* 創(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ù)堆棧空間剩下1/10時限制其增長
(CPU_STK_SIZE) APP_TASK_START_STK_SIZE, //任務(wù)堆棧空間(單位:sizeof(CPU_STK))
(OS_MSG_QTY ) 5u, //任務(wù)可接收的最大消息數(shù)
(OS_TICK ) 0u, //任務(wù)的時間片節(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); //返回錯誤類型
OSStart(&err); //啟動多任務(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 組件(時間戳、關(guān)中斷時間測量和主機(jī)名)
cpu_clk_freq = BSP_CPU_ClkFreq(); //獲取 CPU 內(nèi)核時鐘頻率(SysTick 工作時鐘)
cnts = cpu_clk_freq / (CPU_INT32U)OSCfg_TickRate_Hz; //根據(jù)用戶設(shè)定的時鐘節(jié)拍頻率計算 SysTick 定時器的計數(shù)值
OS_CPU_SysTickInit(cnts); //調(diào)用 SysTick 初始化函數(shù),設(shè)置定時器計數(shù)值和啟動定時器
Mem_Init(); //初始化內(nèi)存管理組件(堆內(nèi)存池和內(nèi)存池表)
#if OS_CFG_STAT_TASK_EN > 0u //如果使能(默認(rèn)使能)了統(tǒng)計任務(wù)
OSStatTaskCPUUsageInit(&err); //計算沒有應(yīng)用任務(wù)(只有空閑任務(wù))運(yùn)行時 CPU 的(最大)
#endif //容量(決定 OS_Stat_IdleCtrMax 的值,為后面計算 CPU
//使用率使用)。
#ifdef CPU_CFG_INT_DIS_MEAS_EN
CPU_IntDisMeasMaxCurReset(); //復(fù)位(清零)當(dāng)前最大關(guān)中斷時間
#endif
/* 創(chuàng)建多值信號量 SemOfKey */
OSSemCreate((OS_SEM *)&SemOfKey, //指向信號量變量的指針
(CPU_CHAR *)"SemOfKey", //信號量的名字
(OS_SEM_CTR )0, //信號量這里是指示事件發(fā)生,所以賦值為0,表示事件還沒有發(fā)生
(OS_ERR *)&err); //錯誤類型
/* 創(chuàng)建 AppTaskKey 任務(wù) */
OSTaskCreate((OS_TCB *)&AppTaskKeyTCB, //任務(wù)控制塊地址
(CPU_CHAR *)"App Task Key", //任務(wù)名稱
(OS_TASK_PTR ) AppTaskKey, //任務(wù)函數(shù)
(void *) 0, //傳遞給任務(wù)函數(shù)(形參p_arg)的實(shí)參
(OS_PRIO ) APP_TASK_KEY_PRIO, //任務(wù)的優(yōu)先級
(CPU_STK *)&AppTaskKeyStk[0], //任務(wù)堆棧的基地址
(CPU_STK_SIZE) APP_TASK_KEY_STK_SIZE / 10, //任務(wù)堆棧空間剩下1/10時限制其增長
(CPU_STK_SIZE) APP_TASK_KEY_STK_SIZE, //任務(wù)堆棧空間(單位:sizeof(CPU_STK))
(OS_MSG_QTY ) 5u, //任務(wù)可接收的最大消息數(shù)
(OS_TICK ) 0u, //任務(wù)的時間片節(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); //返回錯誤類型
/* 創(chuàng)建 LED1 任務(wù) */
OSTaskCreate((OS_TCB *)&AppTaskLed1TCB, //任務(wù)控制塊地址
(CPU_CHAR *)"App Task Led1", //任務(wù)名稱
(OS_TASK_PTR ) AppTaskLed1, //任務(wù)函數(shù)
(void *) 0, //傳遞給任務(wù)函數(shù)(形參p_arg)的實(shí)參
(OS_PRIO ) APP_TASK_LED1_PRIO, //任務(wù)的優(yōu)先級
(CPU_STK *)&AppTaskLed1Stk[0], //任務(wù)堆棧的基地址
(CPU_STK_SIZE) APP_TASK_LED1_STK_SIZE / 10, //任務(wù)堆棧空間剩下1/10時限制其增長
(CPU_STK_SIZE) APP_TASK_LED1_STK_SIZE, //任務(wù)堆棧空間(單位:sizeof(CPU_STK))
(OS_MSG_QTY ) 5u, //任務(wù)可接收的最大消息數(shù)
(OS_TICK ) 0u, //任務(wù)的時間片節(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); //返回錯誤類型
OSTaskDel ( & AppTaskStartTCB, & err ); //刪除起始任務(wù)本身,該任務(wù)不再運(yùn)行
}
/*
*********************************************************************************************************
* KEY TASK
*********************************************************************************************************
*/
static void AppTaskKey ( void * p_arg )
{
OS_ERR err;
uint8_t ucKey1Press = 0;
(void)p_arg;
while (DEF_TRUE) { //任務(wù)體
if( Key_Scan ( macKEY1_GPIO_PORT, macKEY1_GPIO_PIN, 1, & ucKey1Press ) ) //如果KEY1被單擊
OSSemPost((OS_SEM *)&SemOfKey, //發(fā)布SemOfKey
(OS_OPT )OS_OPT_POST_ALL, //發(fā)布給所有等待任務(wù)
(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(); //使用到臨界段(在關(guān)/開中斷時)時必需該宏,該宏聲明和定義一個局部變
//量,用于保存關(guān)中斷前的 CPU 狀態(tài)寄存器 SR(臨界段關(guān)中斷只需保存SR)
//,開中斷時將該值還原。
(void)p_arg;
cpu_clk_freq = BSP_CPU_ClkFreq(); //獲取CPU時鐘,時間戳是以該時鐘計數(shù)
while (DEF_TRUE) { //任務(wù)體
OSSemPend ((OS_SEM *)&SemOfKey, //等待該信號量被發(fā)布
(OS_TICK )0, //無期限等待
(OS_OPT )OS_OPT_PEND_BLOCKING, //如果沒有信號量可用就等待
(CPU_TS *)&ts_sem_post, //獲取信號量最后一次被發(fā)布的時間戳
(OS_ERR *)&err); //返回錯誤類型
ts_sem_get = OS_TS_GET(); //獲取解除等待時的時間戳
macLED1_TOGGLE (); //切換LED1的亮滅狀態(tài)
OS_CRITICAL_ENTER(); //進(jìn)入臨界段,不希望下面串口打印遭到中斷
printf ( "\r\n發(fā)布信號量的時間戳是%d", ts_sem_post );
printf ( "\r\n解除等待狀態(tài)的時間戳是%d", ts_sem_get );
printf ( "\r\n接收到信號量與發(fā)布信號量的時間相差%dus\r\n",
( ts_sem_get - ts_sem_post ) / ( cpu_clk_freq / 1000000 ) );
OS_CRITICAL_EXIT();
}
}
復(fù)制代碼
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1