ATxmega之实现实时系统

分享到:

xmega上实现一个简单的实时系统,对于一般的mcu已经够使用了。下面主要介绍一个简单实时调度系统的实现过程。
初始化调度系统资源,这里使用固定的存储来保存任务资源,没有使用动态分配内存的方式来实现。从而不会出现内存泄漏,但是也存在使用起来不灵活的弊端。我们使用最大的任务数来决定任务的数量,这种方法没有限制,但是受mcu内存的限制,只能根据实际情况来分配任务数,原则够用就可以。我们这里称为任务内存模块。
初始化完成之后,就是添加任务了。
Scheduler_AddTask是添加任务函数,参数1是任务的回调函数,参数23都是时间。添加任务就是在任务内存块中找一个没有使用的内存,把相关数据保存起来。返回的值小于总任务数,添加成功,否则,失败。

 

添加好任务后,就是启动任务了。

 

启动任务我使用定时器来1ms溢出中断来实现。
这个定时器初始化前面说过,这里不多说,溢出回调函数是SysTick_Handler。在这个回调函数中实现任务的调度。
m_u32SystemTime统计系统联系运行时间;m_u32UserTime工用户使用;如果astcTaskTable[u32TaskNumber].u32DelayToNextRun0是,表示任务u32TaskNumber得也运行。根据astcTaskTable[u32TaskNumber].u32PeriodicalDelay值判断是否需要周期性运行该任务。

 

有添加任务,就有删除任务。

 

 

最后就是执行任务了。

 

 

上述任务都要在固定时间周期上运行,那么有紧急任务的时候怎么办,我在系统中添加了一个紧急任务处理函数。

 

pfnHighPriorityTaskCb就是在定时器回调函数SysTick_Handler中的处理函数
  if (pfnHighPriorityTaskCb != NULL)
  {
    pfnHighPriorityTaskCb();
  }
最多延迟1ms执行。
下面举例说明一下使用
4
 
 

更多Atmel及科技资讯请关注:  
Atmel中文官网:http://www.atmel.com/zh/cn/
Atmel技术论坛:http://atmel.eefocus.com/
Atmel中文博客:http://blog.sina.com.cn/u/2253031744
Atmel新浪微博:http://www.weibo.com/atmelcn

 


©2017 Microchip Corporation
facebook google plus twitter linkedin youku weibo rss