这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » UCOS移植-day2

共2条 1/1 1 跳转至

UCOS移植-day2

菜鸟
2018-12-27 17:02:14     打赏
day-2

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



管理员
2018-12-28 09:14:58     打赏
2楼

谢谢楼主分享


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]