完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛扫一扫,分享给好友
|
求大神:
初次接触ucos+emWin,能够跑起来STM32f4和GUI ,我想做个多任务轮换调度执行,看看任务切换情况,我给GUI的优先级分配为4,LED灯的优先级为3,想做个屏幕一直亮着而且LED灯闪烁来看到任务切换,但是LED只是闪一下就灭了,屏幕一直亮着,不知道哪儿出问题了,求解答,我附上main.c的部分代码,求原子哥和大神级别的人物来回答,,谢谢,,[C] 纯文本查看 复制代码 /*********************************************************************************************************** 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. */#endifbsp_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); }} |
|
相关推荐
4个回答
|
|
|
1、任务切换是一个RTOS的核心,不是一两句能够说清除的,建议看一下任哲的那本UCOSII的教材。这里简单的给你讲解一下,在UCOS中有个任务调度器的东东,也就是函数OSSched(),这个函数来完成任务切换的,在UCOS源码中有很多函数调用了这个函数。UCOS是一个可剥夺的抢占式RTOS系统,一个高优先级的任务就绪后,如果你调用了任务切换函数,系统就会切换到这个高优先级的任务上去。由于你的LCD刷新需要的时间比较久,而且LCD任务优先级又高,导致LED任务得不到CPU使用权,因此延时就不准确,这个需要你合理的安排各个任务的优先级。
2、OSTimeDlyHMSM()函数用来对一个任务进行延时,并且这个任务进入等待态,这个函数最后会调用OSSched()函数进行任务切换,当延时结束以后这个任务就会重新进入就绪态。 |
|
|
|
|
|
将你的任务 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 } |
|
|
|
|
|
亲,我用的应该就是你的例程,跑起来和你发的贴的界面一样,一遍遍的刷屏,是从一个网盘上下载的例程,万分感谢!!!让我开始接触ucos+emWin,一开始stm32跑不起来是因为taskstart函数里缺少一个关中断,后来运行起来了,但是就执行一遍就死了,我上午发现了是那个中断.c文件有问题,我把你的例程重新全部移植到我的裸机工程文件里了,现在已运行,剩下的工作就是好好研究研究这些代码了,还有个问题,我想请教一下,:
1)怎么实现多任务切换,也就是任务切换机制到底是什么,我现在不大明白,只知道他是按照优先级进行依次的执行,但是现在一边在刷显示LCD,一边我创建了一个LED闪烁任务,屏幕的优先级比LED的优先极高,但是有时候由于刷屏的任务占用CPU,LED明显的延时时间不准确,怎么能够让各个任务能够实时的有效的执行? 2)OSTimeDlyHMSM(0, 0, 0, 50);这个函数执行延时一段时间到底是为了什么,是为了查询就绪态任务还是只是个空延时,求解答,, 非常期待您的解答,, |
|
|
|
|
|
说的很明白,十分感谢,,
|
|
|
|
|
只有小组成员才能发言,加入小组>>
1022 浏览 1 评论
1852 浏览 0 评论
1833 浏览 1 评论
3258 浏览 5 评论
3585 浏览 9 评论
1025浏览 1评论
1853浏览 1评论
如何知道嵌入式电子控制单元 (ECU) 中的RAM使用情况?
1364浏览 1评论
1855浏览 0评论
1180浏览 0评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 16:05 , Processed in 0.949561 second(s), Total 82, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
2621