这段时间忙了好多事情,先是做FPGA的摄像头,然后又是各种报告,感觉头秃了。。。。。。。
然后原本是想移植ucGUI,显示准备使用FPGA上面的VGA模块和SDRAM,大体想法是STM32的板子和FPGA互联,SDRAM作为显存,VGA直接显示。结果FPGA驱动SDRAM可把我累死了,换句话说,能力还不够吧。不过这是移植ucos成功的后话了。
这次说说移植ucos上面的一些坑。
完成上次的移植之后,可以根据ucos的创建任务函数创建三个任务,一个是主任务,负责创建其他任务,主任务在main函数中创建;一个是LED常亮任务;一个是LED闪亮任务。代码如下:
void start_task(void *pdata) //¿ªÊ¼ÈÎÎñ { OS_CPU_SR cpu_sr=0; //pdata=pdata; systick_init(); /* Initialize the SysTick. */ //OSStatInit(); //³õʼ»¯Í³¼ÆÈÎÎñ OS_ENTER_CRITICAL(); //½øÈëÁÙ½çÇø£¬ÖжÏÎÞ·¨´ò¶Ï OSTaskCreate(task1, (void *)0,&task1_stk[TASK1_STK_SIZE-1], TASK1_PRIO); //OSTaskCreate(task2, (void *)0,&task2_stk[TASK2_STK_SIZE-1], TASK2_PRIO); OS_EXIT_CRITICAL(); //Í˳öÁÙ½çÇø£¬ÖжϿÉÒÔ´ò¶Ï OSTaskDel(STARTUP_TASK_PRIO); //¹ÒÆðÆðʼÈÎÎñ }
static void task1(void *p_arg) { while(1) { LED_ON; delay(0x0fffff); LED_OFF; delay(0x0fffff); //OSTaskCreate(task2, (void *)0,&task2_stk[TASK2_STK_SIZE-1], TASK2_PRIO); //OSTimeDly(500); //OSTaskDel(OS_PRIO_SELF); } }
static void task2(void *p_arg) { while(1) { LED_ON; //OSTaskCreate(task1, (void *)0,&task1_stk[TASK1_STK_SIZE-1], TASK1_PRIO); OSTimeDly(500000); LED_OFF; } }
初步想法是,开始任务创建两个任务,其中常亮任务优先级高与闪亮,这是系统会调度常亮,LED一直亮;常亮任务自动挂起,这是闪亮任务启动,LED灯会闪亮。
经过实验发现调度失败,开始任务创建一个任务的时候,都可以正常调度,两个就不行。而如果在mian函数中创建两个任务的话,系统会根据优先级调度。通过比较发现:任务无法切换。如何是在main函数里面创建,相当于会主动去比较优先级,此时没有任务调度,而在任务里面创建任务时,会产生任务调度。
通过查阅手册了解到,任务切换是产生PenSV中断,在中断服务函数中进行切换,而在移植文件中,中断服务函数的函数名与中断向量表中的名字不匹配,修改之后正常调度。移植成功。
这次大概就是口述了,因为记录工作做的不好。接下来就调试DMA和串口,大概整个移植工作就结束了。