博客首页 | 排行榜 |

tjbbjiang的博客

个人档案
博文分类
【开发学院第三期】+Freertos在MCF52259上的应用  2010-04-26 19:56

  相对于MQX来讲Freertos是个相当容易的操作系统,在MQX不太熟的情况下,个人认为Freertos绝对是个很不错的选择。

  呵呵,对于Freertos的移植工作,已经有前辈为我们做好了。www.freertos.org可下到,里面就有MCF52259的DEMO,但里面东西太多刚开始可能会感觉有点乱。现在自己新建一个工程,把Freertos的代码加进来,算是一个最小系统了。如图所示:

  我们还需要添加点自己的代码才能让系统跑起来。

  FreeRTOSConfig.h是配置freertos的许多功能是否可用的头文件,与FreeRTOS_Tick_Setup.c是Freertos用到的两个中断的初始化及系统节拍中断处理函数的代码。Freertos的系统节拍默认用的是PIT0,当然也可以改用其他的定时器了。MCF52259有好几个保留的中断,用来方便地产生软件中断,Freertos的任务调度用的就是这些中断之一,默认的是中断16。当要进任务调度时只要触发一次该中断即可。

    在新建一个工程时需要把系统节拍及任务调度的中断函数加到exceptions.c中,不然的话在调用vTaskStartScheduler();后会一直执行第一个任务。当你看到自己的工程出现这个情况时不是堆栈溢出的话很可能就是这个原因了。

    在加系统节拍的时候很简单,把FreeRTOS_Tick_Setup.c中的__declspec(interrupt:0) void vPIT0InterruptHandler( void );加到中断向量表中即可;而在加任务调度函数就要注意下了,因为任务调度是用汇编写的。对于Coldfire的汇编不是太了解另外Codewarrior汇编的一些预定义也不是太了解,这里就不仔细解释了(呵呵,等我成为专家的那天再来详细说明下这里)。.在portasm.s中有段标号为vPortYieldISR的汇编,.global vPortYieldISR。我们需要在exceptions.c中声明下这段汇编:extern void vPortYieldISR(void);然后把函数名vPortYieldISR加到中断向量表中就可以了。

    最后一点:当FreeRTOSConfig.h中configCHECK_FOR_STACK_OVERFLOW配置为大于0时会用到vApplicationStackOverflowHook();这个Freertos并没有写好,需要自己写,我这里就定义一个什么也不做的函数,你可以根据自己的情况来定义这个函数。

void vApplicationSackOverflowHook( xTaskHandle *pxTask, signed char *pcTaskName )
{
 pxTask = pxTask;
 pcTaskName = pcTaskName; 
}

    现在就可以在main()里创建自己的任务,然后调用vTaskStartScheduler()让Freertos接管了软硬件资源了。

    vTaskStartScheduler首先会创建一个空闲任务,然后清系统节拍计数为0——>初始化两个重要的中断——>开始调度。

  这里是一个完整的Freertos工程。用到了Freertos的信号量,消息队列,任务管理的几种功能,其中还包括了run time statistics功能的实现,希望对大家使用Freertos有所帮助。FreeRtos.rar

  Freertos的Run Time Statistics功能是统计每个任务占用CPU的时间,方便我们从整体上了解系统的运行情况,类似于我们PC机上的任务管理器。这里也简单介绍下该功能在我们板子上的实现方法。

    该功能需要一个比系统时钟节拍更快的时钟来完成统计工作,MCF52259的PIT0已经用作系统节拍,这里就用PIT1来产生这个更快的时钟。系统节拍的频率为100Hz,为了得到准确的约计结果,这里把PIT1频率设为10KHz。

    首先要做的就是#define configGENERATE_RUN_TIME_STATS 1,使能该功能。

    然后是#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()    vConfigTimerForRunTimeStats():vConfigTimeForRunTimeStats()是对PIT1的初始化,在这里设置PIT1中断产生的频率为10KHz并使能PIT1中断,另外还要在exceptions.c中断向量表中加入PIT1的中断函数。portCONFIGURE_TIMER_FOR_TIME_STATS()会在vTaskStartScheduler();中被调用。PIT1的中断数很简单,清中断标志后只要ulHighFrequencyTimerTicks++;就OK了。

    最后是#define portGET_RUN_TIME_COUNTER_VALUE() ulHighFrequencyTimerTicks,Freertos统计任务运行时间的最小单位就是ulHighFrequencyTimerTicks。会在任务调度中用 portGET_RUN_TIME_COUNTER_VALUE() 得到时间值。

    在这里需要我们自己写的代码就是PIT1初始化及其中断函数。大家可以试着玩玩,还是挺有意思的。下面就是在MCF52259板子上运行时的效果。

  

第一列是任务名字,第二列是系统从上电到现在运行的总时间(以秒为单位),第三列是各个任务运行时间占总时间的百分比。

  

类别:ColdFire |
下一篇:【开发学院第三期】+MCF52259_UART
以下网友评论只代表其个人观点,不代表本网站的观点或立场