查看: 1318|回复: 0

在ATMEGA328P-XMINI 上使用OSA RTOS

[复制链接]
  • TA的每日心情
    奋斗
    2019-12-1 10:07
  • 签到天数: 1617 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    发表于 2015-1-14 10:57:19 | 显示全部楼层 |阅读模式
    分享到:
    FreeRTOS虽然不错,但是对于资源比较少的MCU来说,消耗的RAM和Flash都比较大,留给应用程序的空间比较小。因此使用其他一些紧凑型的RTOS也是有必要的。
    OSA就是这样一个支持多种MCU架构的紧凑型RTOS。OSA是一个非占先式的RTOS,支持任务优先级,支持PIC10, PIC12, PIC16, PIC18, PIC24, dsPIC, AVR, STM8等多种MCU。它使用简单,占用资源少,非常适合一些小资源的MCU使用。
    比较可惜的是OSA已经停止开发了,OSA的网站在:https://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的目录到项目搜索目录中。


    然后在主程序中创建任务、进行任务初始化。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<&ltB5);  // 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<&ltB5);                // blink led  }}int main(){  init();  OS_Init();                          // Init OS  OS_Task_Create(0, task);            // Create tasks.  OS_EI();                            // Enable interrupts  OS_Run();                           // Running scheduler}
    这个例子的功能就是延时,然后翻转LED,和FreeRTOS的例子功能一样。最后在对比一下两个例子的系统资源占用情况
    FreeRTOSOSA
    RAM163750
    Flash68781370

    从对比可以看出,OSA的确是一个轻量级的RTOS。
    osa_demo1.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-4-20 14:52 , Processed in 0.134223 second(s), 18 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.