IAR-FreeRTOS在mega328p中的移植

一.移植前的准备
1.下载FreeRTOS源码:FreeRTOSv10.0.0

2.参考FreeRTOS提供的示例代码

二.代码移植

    在FreeRTOS的示例中没有mega328p,只有一个mega323的例子(..\FreeRTOSv10.0.0\FreeRTOS\Demo\AVR_ATMega323_IAR);打开这个示例先编译,编译时出现错误,提示:“cannot open source file "stdint.h"。

        此时需要配置下编译,IAR默认的是“CLIB”,"CLIB"是C标准库的精简版,这里我们要使用完整版,所以改为“Normal DLIB”即可。

a.

b.

c.

      示例代码已经编译通过了,接下来我们要修改这个示例代码,使之能运行在mega328P中;

     由于这个示例包含了多个例程,为了使用方便,我把AVR这部分需要的单独整理了出来,文件结构如下所示:

    接下来在IAR里建立AVR工程,CPU设置为mega328p,并包含freertos文件路径;


1.

2.


此时编译还不能通过,还要做如下修改:

1,把所有“#include <iom323.h>”改为“#include <ioavr.h>“,因为示例中使用的是mega323;

2,改写“port.c”中“prvSetupTimerInterrupt()”函数,在mega323中定时器中断寄存器为TIMSK,但在mega328p应改为TIMSK1,并更改中断使能值“portCOMPARE_MATCH_A_INTERRUPT_ENABLE”为0x02;

3.注释“portmacro.s90”中的串口中断跳转“

//EXTERN SIG_UART_RECV
//EXTERN SIG_UART_DATA

.........

//    ORG USART_RXC_vect                    ; Vector address
//        jmp SIG_UART_RECV                ; ISR
//
//    ORG USART_UDRE_vect                    ; Vector address
//        jmp SIG_UART_DATA                ; ISR

4.修改“FreeRTOSConfig.h”文件中如下宏定义"

#define configUSE_PREEMPTION        0//1
#define configUSE_IDLE_HOOK            0//1

"

       修改完成后,编译通过,现在在“main.c”中编写测试程序。

/*****************************************************/
//文 件 名: main.c
//文件功能: 主函数
//参考文档: 无
//创 件 人: 程强刚
//创建日期: 2018/01/07
//修改历史: 
/*****************************************************/
#include "..\config\config.h"

__flash UCHAR ucLed[] = {
  0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01
};

/*****************************************************/
//函 数 名: task1
//函数功能: demo
//参考文档: 无
//创 件 人: 程强刚
//创建日期: 2018/01/07
//修改历史: 
/*****************************************************/
void task1(void *pvParameters)
{
  UCHAR i;

  i = 1;
  DDRB = 0xff;
  PORTB = 0xff;
  while (1)
  {
      PORTB = ~i;
      i <<= 1;
      if (!i) 
      {
        i = 1;
      }  
      vTaskDelay(10);    
  }
  
}

/*****************************************************/
//函 数 名: task2
//函数功能: demo
//参考文档: 无
//创 件 人: 程强刚
//创建日期: 2018/01/07
//修改历史: 
/*****************************************************/
void task2(void *pvParameters)
{
  UCHAR i;
  
  DDRD = 0xff;
  PORTD = 0xff;

  while (1)
  {
      for (i = 0; i < 8; i++)
      {
        PORTD = ~ucLed[i];
        vTaskDelay(10);
      }
      
  }
}

/*****************************************************/
//函 数 名: task2
//函数功能: demo
//参考文档: 无
//创 件 人: 程强刚
//创建日期: 2018/01/07
//修改历史: 
/*****************************************************/
void task3(void *pvParameters)
{ 
  
  DDRC = 0xff;
  PORTC = 0xff;
  while (1)
  {
      PORTC = 0xf0;
      vTaskDelay(100);
      PORTC = ~0xf0;
      vTaskDelay(100);      
      
  }
}

/*****************************************************/
//函 数 名: main
//函数功能: demo
//参考文档: 无
//创 件 人: 程强刚
//创建日期: 2018/01/07
//修改历史: 
/*****************************************************/
int main( void )
{
 //创建任务1
  xTaskCreate(task1,                                //任务
              "task1",                              //任务名
              128,                                  //栈大小
              NULL,                                 //形参
              1,                                    //优先级
              NULL );                               //句柄
 //创建任务2
  xTaskCreate(task2,                                //任务
              "task2",                              //任务名
              128,                                  //栈大小
              NULL,                                 //形参
         
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值