UCOSIII移植问题说明
生活随笔
收集整理的這篇文章主要介紹了
UCOSIII移植问题说明
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在進行UCOSIII一致的過程中
在進入Systick中斷的過程中一定要確保系統已經開始運行才能夠進入中斷,否則容易出錯
注意的地方,新添加的0s_cpu_a.asm文件中重新定義了PendSV_Handler();函數,因此要屏蔽掉stm32f10x_it.c中的PendSV_Handler();函數。
/*$PAGE*/ /* ********************************************************************************************************** * INITIALIZE A TASK'S STACK * * Description: This function is called by OS_Task_Create() or OSTaskCreateExt() to initialize the stack * frame of the task being created. This function is highly processor specific. * * Arguments : p_task Pointer to the task entry point address. * * p_arg Pointer to a user supplied data area that will be passed to the task * when the task first executes. * * p_stk_base Pointer to the base address of the stack. * * stk_size Size of the stack, in number of CPU_STK elements. * * opt Options used to alter the behavior of OS_Task_StkInit(). * (see OS.H for OS_TASK_OPT_xxx). * * Returns : Always returns the location of the new top-of-stack' once the processor registers have * been placed on the stack in the proper order. * * Note(s) : 1) Interrupts are enabled when task starts executing. * * 2) All tasks run in Thread mode, using process stack. ********************************************************************************************************** */ //對戰初始化函數 由任務創建CPU_STK *OSTaskStkInit (OS_TASK_PTR p_task, void *p_arg, CPU_STK *p_stk_base, CPU_STK *p_stk_limit, CPU_STK_SIZE stk_size, OS_OPT opt) { CPU_STK *p_stk; //?ú±àD′oˉêyμ?ê±oòòa?ù?Y×??oμ?CPU?é??±àD′è???????oˉêy (void)opt; /* Prevent compiler warning */ p_stk = &p_stk_base[stk_size]; /* Load stack pointer */ /* Registers stacked as if auto-saved on exception */ *--p_stk = (CPU_STK)0x01000000u; /* xPSR */ *--p_stk = (CPU_STK)p_task; /* Entry Point */ *--p_stk = (CPU_STK)OS_TaskReturn; /* R14 (LR) */ *--p_stk = (CPU_STK)0x12121212u; /* R12 */ *--p_stk = (CPU_STK)0x03030303u; /* R3 */ *--p_stk = (CPU_STK)0x02020202u; /* R2 */ *--p_stk = (CPU_STK)p_stk_limit; /* R1 */ *--p_stk = (CPU_STK)p_arg; /* R0 : argument */ /* Remaining registers saved on process stack */ *--p_stk = (CPU_STK)0x11111111u; /* R11 */ *--p_stk = (CPU_STK)0x10101010u; /* R10 */ *--p_stk = (CPU_STK)0x09090909u; /* R9 */ *--p_stk = (CPU_STK)0x08080808u; /* R8 */ *--p_stk = (CPU_STK)0x07070707u; /* R7 */ *--p_stk = (CPU_STK)0x06060606u; /* R6 */ *--p_stk = (CPU_STK)0x05050505u; /* R5 */ *--p_stk = (CPU_STK)0x04040404u; /* R4 */ return (p_stk); //??CPUμ??μD′è????????D }
UCOSIII是一個可剪裁、可固化、可剝奪的多任務系統,沒有任何數目的限制
1)可剝奪多任務管理
2)同優先級任務的時間片輪轉調度
3)極短的關中斷時間 :UCOSIII可以使用鎖定內核的方式而不是關閉中斷的方式保護臨界段代碼,這樣就能夠將關閉中斷的時間降到最低,使得UCOSIII能夠非??斓南鄳袛嗟恼埱?。
3)任務數目不受限制
4)優先級數量不受限制
5)內核對象數目不受限制
6)軟件定時器
7)同時等待多個內核對象
8)直接項任務發送信號
9)直接項任務發送信息
10)任務寄存器
11)任務級始終節拍處理器
12)防止鎖死
13)時間戳
創建任務
//è???μ?ó??è?? #define START_TASK_PRIO 3 //è???????′óD? #define START_STK_SIZE 128 //è????????é OS_TCB StartTaskTCB; //è??????? CPU_STK START_TASK_STK[START_STK_SIZE]; //è???oˉêy void start_task(void *p_arg); //???Dμ?2?êyp_arg??è??ù±?é?ó?2?μ?μ?ê?ò??¨μ?D′é? OS_CPU_USAGE CPUU_Usage;//è???μ?ó??è?? #define TASK1_TASK_PRIO 4 //è???????′óD? #define TASK1_STK_SIZE 128 //è????????é OS_TCB TASK1_TaskTCB; //è??????? CPU_STK TASK1_TASK_STK[START_STK_SIZE]; //è???oˉêy void Task1_task(void *p_arg);//è???μ?ó??è?? #define TASK2_TASK_PRIO 5 //è???????′óD? #define TASK2_STK_SIZE 128 //è????????é OS_TCB TASK2_TaskTCB; //è??????? CPU_STK TASK2_TASK_STK[START_STK_SIZE]; //è???oˉêy void Task2_task(void *p_arg);u16 lcd_discolor[14]={WHITE, BLACK, BLUE, BRED, GRED, GBLUE, RED, MAGENTA, GREEN, CYAN, YELLOW,BROWN, BRRED, GRAY};int main() { OS_ERR err;CPU_SR_ALLOC(); //?a?ù2??ü1?2?±¨cpu_sr??óD?¨ò?μ?′í?ó ??è?áù???μ???°2?Dí?èμ÷ó??a??oê?¨ò?//CPU_SR cpu_sr = (CPU_SR)0;delay_init();NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);uart_init(115200);LED_Init();LCD_Init(); POINT_COLOR = RED;LCD_ShowString(30,10,200,16,16,(u8 *)"ALIENTEK STM32F1"); LCD_ShowString(30,30,200,16,16,(u8 *)"UCOSIII Examp 6-1");LCD_ShowString(30,50,200,16,16,(u8 *)"Task Creat and Del");LCD_ShowString(30,70,200,16,16,(u8 *)"ATOM@ALIENTEK");LCD_ShowString(30,90,200,16,16,(u8 *)"2015/3/19");OSInit(&err); //UCOSIIIμ?3?ê??ˉOS_CRITICAL_ENTER();//??è?áù???? μ÷?è?÷é??? ?ú?a??ê±oò???1è???μ?μ÷?èOSTaskCreate ((OS_TCB *)&StartTaskTCB,(CPU_CHAR *)"start task",(OS_TASK_PTR )start_task,(void *)0, //???á×÷?ap_arg′?μY??start_task();oˉêy(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,(OS_TICK )0, //ê1ó?μ?ê±????μ?3¤?è(void *)0,(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,(OS_ERR *)&err);OS_CRITICAL_EXIT(); //í?3?áù????OSStart(&err);while(1);}void start_task(void *p_arg) { OS_ERR err;CPU_SR_ALLOC();p_arg = p_arg;#if OS_CFG_STAT_TASK_EN > 0uOSStatTaskCPUUsageInit(&err); //í3??è??? #endif#ifdef CPU_CFG_INT_DIS_MEAS_EN //è?1?ê1?üá?2aá??D??1?±?ê±?? oˉêyò??-ê1?üCPU_IntDisMeasMaxCurReset(); #endif#if OS_CFG_SCHED_ROUND_ROBIN_EN //μ±ê1ó?ê±??????×aμ?ê±oò//ê1?üê±??????×aμ÷?è1|?ü,ê±????3¤?è?a1???μí3ê±?ó?ú??£??è1*5=5msOSSchedRoundRobinCfg(DEF_ENABLED,1,&err); //?a??ê±??????×aμ÷?è #endifOS_CRITICAL_ENTER(); //??è?áù???? ±?D?ê1?üCPU_SR_ALLOC();oˉêy//??è?áù??????ê??aá?·à?1£??úoˉêy3?ê??ˉμ?ê±oòoˉêyμ?3?ê??ˉ1y3ì±?′ò???ì3éoˉêyμ?2??÷?-òòμ?2??ü1?ê1ó?//′′?¨TASK1è???OSTaskCreate((OS_TCB * )&TASK1_TaskTCB, (CPU_CHAR * )"Task1 task", (OS_TASK_PTR )Task1_task, (void * )0, //p_argoˉêy (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 )2, //ò???ê±????3¤?èê?5oá??£?2??ê±????3¤?è??o?ê?10oá?? (void * )0, (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,(OS_ERR * )&err); //′′?¨TASK2è???OSTaskCreate((OS_TCB * )&TASK2_TaskTCB, (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 )0, (OS_TICK )1, //ê±????3¤?è?a2*5=10ms (void * )0, (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, (OS_ERR * )&err); OS_CRITICAL_EXIT(); //í?3?áù????OSTaskDel((OS_TCB*)0,&err); //é?3ystart_taskè???×?éí μ±?aNULLμ?ê±oòê???é?3yμ±?°è??? }//task1è???oˉêy void Task1_task(void *p_arg) {u8 i,task1_num=0; OS_ERR err;p_arg = p_arg; POINT_COLOR = RED;LCD_ShowString(30,130,110,16,16,(u8 *)"Task1 Run:000"); POINT_COLOR = BLUE;while(1){CPUU_Usage = TASK2_TaskTCB.StkUsed;printf("CPUU_Usage=%d",CPUU_Usage);task1_num++; //è???1?′DD′?êy?ó1 ×¢òatask1_num1?óμ?255μ?ê±oò?á??á?£?£?LCD_ShowxNum(110,130,task1_num,3,16,0x80); //??ê?è????′DD′?êyfor(i=0;i<5;i++) printf("Task1:01234\r\n");LED0 = ~LED0;OSTimeDlyHMSM(0,0,0,200,OS_OPT_TIME_HMSM_STRICT,&err); //?óê±1s} }//task2è???oˉêy void Task2_task(void *p_arg) {u8 i,task2_num=0; OS_ERR err;p_arg = p_arg; POINT_COLOR = RED;LCD_ShowString(30,150,110,16,16,(u8 *)"Task2 Run:000"); POINT_COLOR = BLUE;while(1){task2_num++; //è???2?′DD′?êy?ó1 ×¢òatask1_num2?óμ?255μ?ê±oò?á??á?£?£?LCD_ShowxNum(110,150,task2_num,3,16,0x80); //??ê?è????′DD′?êyfor(i=0;i<120;i++){ printf("i=%d\r\n",i);}LED1 = ~LED1;OSTimeDlyHMSM(0,0,0,200,OS_OPT_TIME_HMSM_STRICT,&err); //?óê±1s} }總結
以上是生活随笔為你收集整理的UCOSIII移植问题说明的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于环境气象因素影响的异常就诊量预测
- 下一篇: 【2016年第6期】大规模分布式科学数据