OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4852|回复: 4

uocs任务执行问题

[复制链接]

8

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
88
金钱
88
注册时间
2014-9-15
在线时间
2 小时
发表于 2014-12-11 10:58:56 | 显示全部楼层 |阅读模式
5金钱
求大神:
   初次接触ucos+emWin,能够跑起来stm32f4和GUI ,我想做个多任务轮换调度执行,看看任务切换情况,我给GUI的优先级分配为4,LED灯的优先级为3,想做个屏幕一直亮着而且LED灯闪烁来看到任务切换,但是LED只是闪一下就灭了,屏幕一直亮着,不知道哪儿出问题了,求解答,我附上main.c的部分代码,求原子哥和大神级别的人物来回答,,谢谢,,
[mw_shl_code=c,true]/* ********************************************************************************************************* * TASK PRIORITIES ********************************************************************************************************* */ /*?¨????????????*/ #define APP_TASK_START_PRIO 10 //3 #define APP_TASK_KBD_PRIO 5 //5 #define APP_TASK_GUI_PRIO 4 //4 #define APP_TASK_LEDD_PRIO 3 //6 #define OS_TASK_TMR_PRIO (OS_LOWEST_PRIO - 2) /* ********************************************************************************************************* * TASK STACK SIZES * Size of the task stacks (# of OS_STK entries) ********************************************************************************************************* */ /*?¨???????????ó??*/ #define APP_TASK_GUI_STK_SIZE 1024 #define APP_TASK_START_STK_SIZE 512 #define APP_TASK_KBD_STK_SIZE 1024 #define APP_TASK_LEDD_STK_SIZE 1024 /* ********************************************************************************************************* * LOCAL DEFINES ********************************************************************************************************* */ #define LED_DLYCOUNT_MAX 1000 #define LED_DLYCOUNT_MIN 50 #define LED_DLYCOUNT_STEP 50 /* ********************************************************************************************************* * LOCAL GLOBAL VARIABLES ********************************************************************************************************* */ /*?¨???????????????ó??*/ static OS_STK App_TaskGuiStk[APP_TASK_GUI_STK_SIZE]; static OS_STK App_TaskStartStk[APP_TASK_START_STK_SIZE]; static OS_STK App_TaskKbdStk[APP_TASK_KBD_STK_SIZE]; static OS_STK App_TaskLeddStk[APP_TASK_LEDD_STK_SIZE]; static uint16_t led_dly_cout = 100; /* ********************************************************************************************************* * LOCAL FUNCTION PROTOTYPES ********************************************************************************************************* */ static void App_TaskCreate (void); static void App_EventCreate (void); static void App_TaskGui (void *p_arg); static void App_TaskStart (void *p_arg); static void App_TaskKbd (void *p_arg); static void App_TaskLedd (void *p_arg); static void Delaly1s(void) { uint16_t i; for (i = 0; i < 50000; i++); } /* ********************************************************************************************************* * ?? ?? ??: main * ???????÷: c???ò???? * ?? ?????? * ·? ?? ??: ?í?ó?ú??(???è???í) ********************************************************************************************************* */ int main (void) { uint8_t os_err; //delay_init(); //??????ucos???? //__disable_irq(); //?????ù???????? OSInit(); /* Initialize "uC/OS-II, The Real-Time Kernel". */ // os_err = OSTaskCreate((void (*)(void *)) App_TaskStart, /*?¨??????????*/ // (void * ) 0, // (OS_STK * )&App_TaskStartStk[APP_TASK_START_STK_SIZE - 1], // (INT8U ) APP_TASK_START_PRIO); os_err = OSTaskCreateExt((void (*)(void *)) App_TaskStart, /* Create the start task. */ (void * ) 0, (OS_STK * )&App_TaskStartStk[APP_TASK_START_STK_SIZE - 1], (INT8U ) APP_TASK_START_PRIO, (INT16U ) APP_TASK_START_PRIO, (OS_STK * )&App_TaskStartStk[0], (INT32U ) APP_TASK_START_STK_SIZE, (void * )0, (INT16U )(OS_TASK_OPT_STK_CLR | OS_TASK_OPT_STK_CHK)); #if (OS_TASK_NAME_SIZE >= 11) OSTaskNameSet(APP_TASK_START_PRIO, (CPU_INT08U *)"Start Task", &os_err); #endif // PC_VectSet(0x08, OSTickISR); /* Install uC/OS-II's clock tick ISR */ // PC_SetTickRate(OS_TICKS_PER_SEC); /* Reprogram tick rate */ OSStart(); /* Start multitasking (i.e. give control to uC/OS-II). */ return (0); } static void App_TaskStart (void *p_arg) { OS_CPU_SR cpu_sr=0; (void)p_arg; OS_ENTER_CRITICAL(); //??????????????·¨±??????ò?? OS_CPU_SysTickInit(); /* Initialize the SysTick. */ #if (OS_TASK_STAT_EN > 0) OSStatInit(); /* Determine CPU capacity. */ #endif bsp_InitTimer(); RA8875_InitHard(); BUZZER_GPIO_Config(); //GPIO_SetBits(GPIOA, GPIO_Pin_4); GPIO_SetBits(GPIOA, GPIO_Pin_5); //GPIO_SetBits(GPIOC, GPIO_Pin_2); GPIO_SetBits(GPIOC, GPIO_Pin_1); GPIO_SetBits(GPIOC, GPIO_Pin_4); RA8875_SetBackColor(0xFFFF); RA8875_ClrScr(0xFFE0); /* ?????????????? */ GUI_Init(); App_EventCreate(); /* Create application events. */ App_TaskCreate(); /* Create application tasks. */ OS_EXIT_CRITICAL(); //????????????????±??????ò?? while (1) { OSTimeDlyHMSM(0, 0, 0, 50); } } static void App_TaskCreate (void) { uint8_t os_err; os_err = OSTaskCreateExt((void (*)(void *)) App_TaskGui, (void * ) 0, (OS_STK * )&App_TaskGuiStk[APP_TASK_GUI_STK_SIZE - 1], (INT8U ) APP_TASK_GUI_PRIO, (INT16U ) APP_TASK_GUI_PRIO, (OS_STK * )&App_TaskGuiStk[0], (INT32U ) APP_TASK_GUI_STK_SIZE, (void * ) 0, (INT16U )(OS_TASK_OPT_STK_CLR | OS_TASK_OPT_STK_CHK)); #if (OS_TASK_NAME_SIZE >= 9) OSTaskNameSet(APP_TASK_GUI_PRIO, "GUI", &os_err); #endif os_err = OSTaskCreateExt((void (*)(void *)) App_TaskKbd, (void * ) 0, (OS_STK * )&App_TaskKbdStk[APP_TASK_KBD_STK_SIZE - 1], (INT8U ) APP_TASK_KBD_PRIO, (INT16U ) APP_TASK_KBD_PRIO, (OS_STK * )&App_TaskKbdStk[0], (INT32U ) APP_TASK_KBD_STK_SIZE, (void * ) 0, (INT16U )(OS_TASK_OPT_STK_CLR | OS_TASK_OPT_STK_CHK)); #if (OS_TASK_NAME_SIZE >= 9) OSTaskNameSet(APP_TASK_KBD_PRIO, "Keyboard", &os_err); #endif os_err = OSTaskCreateExt((void (*)(void *)) App_TaskLedd, (void * ) 0, (OS_STK * )&App_TaskLeddStk[APP_TASK_LEDD_STK_SIZE - 1], (INT8U ) APP_TASK_LEDD_PRIO, (INT16U ) APP_TASK_LEDD_PRIO, (OS_STK * )&App_TaskLeddStk[0], (INT32U ) APP_TASK_LEDD_STK_SIZE, (void * ) 0, (INT16U )(OS_TASK_OPT_STK_CLR | OS_TASK_OPT_STK_CHK)); #if (OS_TASK_NAME_SIZE >= 9) OSTaskNameSet(APP_TASK_LEDD_PRIO, "Ledd", &os_err); #endif } static void App_TaskGui (void *p_arg) { int i; WM_HWIN hWin; //GUI_PID_STATE Button_State; //?????è±?×??? OS_CPU_SR cpu_sr=0; (void)p_arg; OS_ENTER_CRITICAL(); //??????????????·¨±??????ò?? OS_EXIT_CRITICAL(); //????????????????±??????ò?? while (1) { // test(); MainTask(); // hWin = GUI_ExecDialogBox(aDialogCreate, GUI_COUNTOF(aDialogCreate), _cbCallback, 0, 50, 0); // GUI_Exec(); // GUI_TOUCH_GetState(&Button_State); //?????????è±?×??? // GUI_TOUCH_StoreStateEx(&Button_State); //?????????è±?×??? // GUI_DispDecAt(Button_State.x,300,0,4); //?????è±??±?°x×?±ê // GUI_DispDecAt(Button_State.y,300,20,4); //?????è±??±?°y×?±ê // GUI_DispDecAt(Button_State.Pressed,300,40,4); //??·?°??? OSTimeDlyHMSM(0, 0, 0, 50); } } static void App_TaskKbd (void *p_arg) { //WM_HWIN hWin; while(1) { STM_EVAL_LEDInit(LED3); STM_EVAL_LEDInit(LED4); STM_EVAL_LEDToggle(LED3); STM_EVAL_LEDToggle(LED4); //GUI_Exec(); GUI_TOUCH_Exec(); // GUI_DispDecAt(GUI_TOUCH_X_MeasureX(),400,0,6); // // GUI_DispDecAt(GUI_TOUCH_X_MeasureY(),400,20,6); // // GUI_DispDecAt(GUI_GetKey(),400,40,6); OSTimeDlyHMSM(0, 0, 0, 20); } } static void App_TaskLedd (void *p_arg) { OS_CPU_SR cpu_sr=0; (void)p_arg; OS_ENTER_CRITICAL(); //??????????????·¨±??????ò?? OS_EXIT_CRITICAL(); //????????????????±??????ò?? while(1) { GPIO_SetBits(GPIOA, GPIO_Pin_4); Delaly1s(); GPIO_ResetBits(GPIOA, GPIO_Pin_4); Delaly1s(); //OSTaskSuspend(OS_PRIO_SELF); // ???????? OSTimeDlyHMSM(0, 0, 0, 50); } }[/mw_shl_code]


最佳答案

查看完整内容[请看2#楼]

1、任务切换是一个RTOS的核心,不是一两句能够说清除的,建议看一下任哲的那本UCOSII的教材。这里简单的给你讲解一下,在UCOS中有个任务调度器的东东,也就是函数OSSched(),这个函数来完成任务切换的,在UCOS源码中有很多函数调用了这个函数。UCOS是一个可剥夺的抢占式RTOS系统,一个高优先级的任务就绪后,如果你调用了任务切换函数,系统就会切换到这个高优先级的任务上去。由于你的LCD刷新需要的时间比较久,而且LCD任务优先级 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2014-12-11 10:58:57 | 显示全部楼层
1、任务切换是一个RTOS的核心,不是一两句能够说清除的,建议看一下任哲的那本UCOSII的教材。这里简单的给你讲解一下,在UCOS中有个任务调度器的东东,也就是函数OSSched(),这个函数来完成任务切换的,在UCOS源码中有很多函数调用了这个函数。UCOS是一个可剥夺的抢占式RTOS系统,一个高优先级的任务就绪后,如果你调用了任务切换函数,系统就会切换到这个高优先级的任务上去。由于你的LCD刷新需要的时间比较久,而且LCD任务优先级又高,导致LED任务得不到CPU使用权,因此延时就不准确,这个需要你合理的安排各个任务的优先级。
2、OSTimeDlyHMSM()函数用来对一个任务进行延时,并且这个任务进入等待态,这个函数最后会调用OSSched()函数进行任务切换,当延时结束以后这个任务就会重新进入就绪态。
开往春天的手扶拖拉机
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2014-12-11 11:21:44 | 显示全部楼层
将你的任务 App_TaskLedd的任务函数while(1)改为下面的试一试
while(1)
{
       GPIO_SetBits(GPIOA, GPIO_Pin_4);
       OSTimeDlyHMSM(0, 0, 1, 0);    //延时1s
       GPIO_ResetBits(GPIOA, GPIO_Pin_4);
       OSTimeDlyHMSM(0, 0, 1, 0);   //延时1s
}
开往春天的手扶拖拉机
回复

使用道具 举报

8

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
88
金钱
88
注册时间
2014-9-15
在线时间
2 小时
 楼主| 发表于 2014-12-11 14:05:54 | 显示全部楼层
回复【2楼】zuozhongkai:
---------------------------------
亲,我用的应该就是你的例程,跑起来和你发的贴的界面一样,一遍遍的刷屏,是从一个网盘上下载的例程,万分感谢!!!让我开始接触ucos+emWin,一开始stm32跑不起来是因为taskstart函数里缺少一个关中断,后来运行起来了,但是就执行一遍就死了,我上午发现了是那个中断.c文件有问题,我把你的例程重新全部移植到我的裸机工程文件里了,现在已运行,剩下的工作就是好好研究研究这些代码了,还有个问题,我想请教一下,:
1)怎么实现多任务切换,也就是任务切换机制到底是什么,我现在不大明白,只知道他是按照优先级进行依次的执行,但是现在一边在刷显示LCD,一边我创建了一个LED闪烁任务,屏幕的优先级比LED的优先极高,但是有时候由于刷屏的任务占用CPU,LED明显的延时时间不准确,怎么能够让各个任务能够实时的有效的执行?  
2)OSTimeDlyHMSM(0, 0, 0, 50);这个函数执行延时一段时间到底是为了什么,是为了查询就绪态任务还是只是个空延时,求解答,,
非常期待您的解答,,
回复

使用道具 举报

8

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
88
金钱
88
注册时间
2014-9-15
在线时间
2 小时
 楼主| 发表于 2014-12-11 16:41:20 | 显示全部楼层
回复【4楼】zuozhongkai:
---------------------------------
说的很明白,十分感谢,,
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 08:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表