这段时间忙了好多事情,先是做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和串口,大概整个移植工作就结束了。
我要赚赏金
