在ATMEGA328P-XMINI 上使用OSA RTOS

作者: shaoziyang
上传时间为: 2015-01-14 10:57 AM

FreeRTOS虽然不错,但是对于资源比较少的MCU来说,消耗的RAM和Flash都比较大,留给应用程序的空间比较小。因此使用其他一些紧凑型的RTOS也是有必要的。

OSA就是这样一个支持多种MCU架构的紧凑型RTOS。OSA是一个非占先式的RTOS,支持任务优先级,支持PIC10, PIC12, PIC16, PIC18, PIC24, dsPIC, AVR, STM8等多种MCU。它使用简单,占用资源少,非常适合一些小资源的MCU使用。

比较可惜的是OSA已经停止开发了,OSA的网站在:http://wiki.pic24.ru/doku.php/en/osa/ref/download/intro

下面就介绍OSA在Atmega328P xplained mini上的使用方法。

首先是创建新项目,过程就不重复了。

然后需要创建一个RTOS的配置文件。OSA的使用方法和FreeRTOS有些类似,都是需要在项目中使用一个配置文件,OSA中的配置文件是OSAcfg.h。第一个例子比较简单,只使用OS定时器延时,所以我们先在这个配置文件中允许使用定时器。

#ifndef _OSACFG_H
#define _OSACFG_H

//------------------------------------------------------------------------------
// SYSTEM
//------------------------------------------------------------------------------

#define OS_TASKS                3   // Number of tasks that can be active at one time
//#define OS_DISABLE_PRIORITY         // 
#define OS_USE_INLINE_TIMER
//#define OS_TTIMER_SIZE          1

//------------------------------------------------------------------------------
// ENABLE CONSTANTS
//------------------------------------------------------------------------------

#define OS_ENABLE_TTIMERS           // Enable task timers (OS_Delay and OS_xxx_Wait_TO)


#endif

然后在AS6中创建OSA目录,再将OSA的文件复制到这个目录中。

下一步就是添加OSA文件到项目。OSA只需要添加osa.c就可以了,这一点比大部分RTOS都简单。

然后在添加osa的目录和OSAcfg.h的目录到项目搜索目录中。

0.jpg


然后在主程序中创建任务、进行任务初始化。OSA的使用比较简单,下面是主要步骤:

  • 调用函数OS_Init()进行OS初始化
  • 使用OS_Task_Create创建任务
  • 设置硬件定时器,并将OS_Timer()放入定时器中断。OSA可以使用任何一个硬件定时器进行OS调度,调度周期也可以自己定义。
  • 使用OS_EI()允许系统中断
  • 使用OS_Run()启动调度器


下面是一个简单的测试程序

#define F_CPU 8000000L

#include <osa.h>

#include <avr\io.h>
#include <avr\interrupt.h>

void init()
{
  // IO
  DDRB = (1<<PB5);

  // timer1
  OCR1A = F_CPU/(8*100);              // 10ms
  TCNT1 = 0;
  TCCR1A = 0;
  TCCR1B = (1<<WGM12)|(1<<CS11);      // clk/8
  TIMSK1 = (1<<OCIE1A);               // enable TIMER1 OC1A interrupt
}

ISR(TIMER1_COMPA_vect)
{
  OS_Timer();
}

void task()
{
  while(1)
  {
    OS_Delay(100);                    // Delay
    PORTB ^= (1<<PB5);                // blink led
  }
}

int main()
{
  init();

  OS_Init();                          // Init OS

  OS_Task_Create(0, task);            // Create tasks.

  OS_EI();                            // Enable interrupts
  OS_Run();                           // Running scheduler

}

1.jpg 

这个例子的功能就是延时,然后翻转LED,和FreeRTOS的例子功能一样。最后在对比一下两个例子的系统资源占用情况
FreeRTOSOSA
RAM163750
Flash68781370

从对比可以看出,OSA的确是一个轻量级的RTOS。


osa_demo1.zip

全部评论 ()

创建讨论帖子

登录 后参与评论
系统提示