FreeRtos移植到Arduino UNO

最近在浏览FreeRtos的手册时,发现其支持AVR系列的8位单片机。正好自己手上有一块Arduino UNO的板子,因此希望移植到Arduino上。由于好久没有使用这个平台了,重新安装这套开发环境。在安装Atmel Studio 7时一直安装不成功(一直等待Visual Studio 2015 Shell的安装),灰心丧气。决定用现在使用广泛的Eclipse来来代替,但是下载编译工具winavr时却又下载不下来。实在没办法,又安装了Arduino的编译环境,然后按照网上帖子的方法配置了Eclipse(由于Arduino编译器带有avrdude,下载工具也一块搞定了)。

工具链如下:Eclipse+AVR-GCC+avrdude,其中的配置参考网上高手的帖子。


下面主要描述FreeRtos的移植。在FreeRtos的官网上下载下来的源码当中有很多芯片的Demo。推荐使用这些Demo来参考移植,这里我使用的版本是FreeRTOSv9.0.0。首先最好有一个可以工作的工程(例如LED、串口输出等),然后就可以开始移植了。在其Demo文件夹中找到AVR_ATMega323_WinAVR,然后将其中的FreeRTOSConfig.h文件Copy到自己的工程下,然后分别将FreeRTOS的Source文件夹下的*.c文件拷贝到自己的工程中,以及Source中的Include文件夹下所有的头文件也copy到自己的工程中。然后进入portable文件夹中,找到自己芯片相关的那个目录(这里我用的是GCC\ATMega323),将其中的文件也copy到自己的工程中即可。


以上,基本的文件拷贝结束,我们来修改文件了。首先,按照硬件配置来修改FreeRTOSConfig.h,这里我基本上没有更改该头文件,关掉了部分功能,按实际情况修改了主频。


然后修改main.c文件,这里我之前的工程中有LED闪烁和串口输出功能,因此我在main函数中增加两个任务,分别来实现之前的功能。


工程结构如下:


代码很简单,然后就可以编译了(main.c文件中加入#include "FreeRTOS.h",#include "task.h",#include "FreeRTOSConfig.h")。编译发现Port.c文件中的TIMSK找不到,查看datasheet,发现328对应的是TIMSK1;此外中断处理函数SIG_OUTPUT_COMPARE1A在328中应该改为TIMER1_COMPA_vect。修改完之后,再次编译发现找不到pvPortMalloc,想起FreeRtos中对此的介绍,然后去FreeRTOS源码中找了一个heap_1.c拷贝到工程中(随便选了一种分配内存的方法),继续编译,提示找不到函数vApplicationIdleHook(由于我一开始在FreeRTOSConfig.h中没有关掉这个宏定义,因此需要调用该函数),修改宏定义为0,编译通过。

程序下载到板子上发现不能正常运行,由于没有调试器,顿时陷入一种尴尬的状态。好在万能的网络给了我答案,帖子《在ATmega328P上使用FreeRTOS》中说到定时器中断允许位不一致,查看datasheet和Port.c文件中对portCOMPARE_MATCH_A_INTERRUPT_ENABLE的定义,将其由0x10修改为0x02,下载程序之后板子正常工作。移植工作结束。


总体来说,移植FreeRtos的工作还是很少。关键的工作FreeRTOS的Demo都搞定了,比起uCOS系统,可以说这个移植很简单。此外该操作系统占用的资源很小,编译结果显示,代码只有9K不到,数据1K多点。这对资源稀少的处理器也是一个福音,如果有需要8位单片机跑FreeRTOS也是很轻松的。如何使用FreeRTOS还需要更多的努力去摸索学习。


  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值