这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » Realview MDK中实时操作系统内核RTX的使用

共4条 1/1 1 跳转至

Realview MDK中实时操作系统内核RTX的使用

助工
2008-05-15 11:52:19     打赏

更多关于RealView MDK的技术文章,请点击此处!

Realview MDK中实时操作系统内核RTX的使用

 


 更多关于RealView MDK的技术文章,请点击此处!

针对复杂的嵌入式应用,MDK内部集成了由ARM开发的实时操作系统(RTOS)内核RTX,它可以帮助用户解决多时序安排、任务调度、定时等工作。值得一提的是,RTX可以无缝集成到MDK工具中,是一款需要授权的、无版税的RTOSRTX程序采用标准C语言编写,由RVCT编译器进行编译。

使用RTX内核,首先打开Options for Target,选择Target标签,将Target标签中的Operating下拉框改为 RTX Kernel,如图1所示。

 

更多关于RealView MDK的技术文章,请点击此处!

1 Options for Target

这样,无需任何定义和声明,可以直接调用操作系统的函数。笔者通过一个实验进行说明。该实验利用RTXCortex-M3上实现多任务。Cortex-M3处理器是ARM首次针对低成本应用提供技术,减少使用内存,并在极小的RISC内核上提供优异的性能。此外,基于系统外设的高度集成化最佳地使用了芯片空间。RTX内核非常小,效率高,正好适用于Cortex-M3上,达到优化系统性能目的。

该实验设计了四个任务。第一个任务用来初始化其他任务,第二个任务用来不断读取AD采样的值;第三个任务用来在LCD屏上动态显示采样值;第四个任务用来根据采样值控制LED灯闪烁。程序开始运行时首先运行init任务,该任务用来初始化其他三个任务t_phase_ADCt_phase_LCDt_phase_LED。任务创建完毕后,三个任务都处于READY状态。在英蓓特STM103V100开发板上,旋转AD按钮,进行采样(任务2),采样的值显示在LCD屏上(任务3),同时通过采样值控制LED灯闪烁的速度(任务4)。使用操作系统OS_TID定义任务名称t_phase_ADCt_phase_LCD t_phase_LED

OS_TID t_phase_ADC;                            /* assigned task id of task: 2 */

OS_TID t_phase_ LCD;                            /* assigned task id of task: 3 */

OS_TID t_phase_LED;                           /* assigned task id of task: 4 */

使用os_tsk_create创建任务t_phase_ADCt_phase_LCDt_phase_LEDos_tsk_delete_self删除自身任务,实行任务切换。 任务的创建和初始化是在主函数中定义的。更多关于RealView MDK的技术文章,请点击此处!

 

int main (void) {

   SetupClock();

  NVIC_Configuration();

  SetupADC  ();

  SetupTIMER1();

  SetupWWDG();

  lcd_init  ();

  lcd_clear ();

  lcd_print ("Motor Speed Is:");

  os_sys_init (init);                    /* Initialize RTX and start init    */

}

void init (void) __task {

   t_phase_ADC = os_tsk_create (phase_ADC, 0);  /* start task phase2   */

   t_phase_LCD = os_tsk_create (phase_LCD, 0);   /* start task phase3   */

   t_phase_LED = os_tsk_create (phase_LED, 0);   /* start task phase4   */         

   os_tsk_delete_self ();

}

任务初始化完毕后,三个任务都处于就绪状态。t_phase_ADC任务用来进行采样,如果采样值在一定范围内偏差,不触发t_phase_LCD任务;如果超过偏差范围,表示AD按钮经过旋转,将新采样值存储在temp中,通过给任务t_phase_LCD 发信号,signal_func (t_phase_LCD),唤醒t_phase_LCD任务。

void phase_ADC(void) __task {

  int i;

  long sum;

  int temp;

  for (;;) {

   sum=0;

   for(i=0;i<1000;i++)                 

   {

     sum=sum+ADC_ConvertedValue;

         }

   temp=sum/1000;

     if(speed-temp>40|speed-temp<40)     

   {

    speed=temp;

    signal_func (t_phase_LCD);  

   }

  } 

}

t_phase_LCD任务在唤醒前都处于就绪状态,通过os_evt_wait_and进行控制。执行完自身任务后,通过signal_func (t_phase_LED),将唤醒t_phase_LED任务。更多关于RealView MDK的技术文章,请点击此处!

 

void phase_LCD (void) __task {

  for (;;) {

  os_evt_wait_and (0x0001, 0xffff);    /* wait for an event flag 0x0001 */

  transform(speed);

  Counter=0x60+(4047-speed)/128;

  set_cursor(7, 1);

  lcd_print (LCD_Content);

  signal_func (t_phase_LED);

  }

}

   t_phase_LED任务用来控制LED闪烁。更多关于RealView MDK的技术文章,请点击此处!

 

void phase_LED (void) __task {

  for (;;) {

    if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_13)!=0)

        GPIO_WriteBit(GPIOC, GPIO_Pin_6, Bit_SET);

         else

             GPIO_WriteBit(GPIOC, GPIO_Pin_6, Bit_RESET);

    if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_14)!=0)

             GPIO_WriteBit(GPIOC, GPIO_Pin_7, Bit_SET);

         else

             GPIO_WriteBit(GPIOC, GPIO_Pin_7, Bit_RESET);

         if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_15)!=0)

        GPIO_WriteBit(GPIOC, GPIO_Pin_8, Bit_SET);

         else

             GPIO_WriteBit(GPIOC, GPIO_Pin_8, Bit_RESET); 

  }

}

任务触发示意图如下:

 

 

 

通过实时内核RTX,能有效控制多任务运行,减少CPU占用时间,达到性能优化目的。

更多关于RealView MDK的技术文章,请点击此处!




关键词: Realview     实时     操作系统     内核     使用     任务    

助工
2008-05-17 08:49:37     打赏
2楼
这篇没有人看吗?

菜鸟
2008-05-19 22:46:40     打赏
3楼

在用,RTX确实是一个好东西,最初是用CRAM编译器的。不过现在CRAM编译器已经不被KEIL支持了,在RealView里面叫RTL了。功能确实很强大的操作系统。不喜欢UCOS,更喜欢RTL。


助工
2008-05-20 09:19:51     打赏
4楼
系统是超牛的系统,好像使用的人很少哦

共4条 1/1 1 跳转至

回复

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