IAR-FreeRTOS在mega328p中的移植

本文详细介绍了如何将FreeRTOS操作系统移植到AVR的mega328p微控制器上,包括从下载源码、解决IAR编译问题、修改头文件、调整配置、适配中断及修复Proteus仿真问题等步骤。最终成功让FreeRTOS在mega328p上运行起来。
摘要由CSDN通过智能技术生成

一.移植前的准备
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,                                 //形参
         
回答: IAR移植FreeRTOS的过程可以分为以下几个步骤。首先,从FreeRTOS官方网站下载源码,并复制FreeRTOSConfig.h文件到待移植的工程目录。然后,将source目录下的源码文件全部移植到新建的IAR工程FreeRTOS文件夹。接下来,在IAR工程对portable文件夹进行裁剪,只保留IAR启动文件和内存管理的源代码。在IAR软件新建两个组,并添加文件,分别是FreeRTOS_CORE和FreeRTOS_PORTABLE,其FreeRTOS_PORTABLE选择与目标芯片相匹配的文件。添加头文件后,进行编译。在编译过程可能会遇到一些问题。比如找不到FreeRTOSConfig.h文件,可以从官方源码寻找并复制到工程目录。另外,可能会出现重复定义的问题,可以屏蔽stm32f4xx_it.c与port.c重复定义的函数。还有一些与hook相关的函数的报错,可以将configUSE_IDLE_HOOK、configUSE_TICK_HOOK、configUSE_MALLOC_FAILED_HOOK、configCHECK_FOR_STACK_OVERFLOW这些宏设置为0来关闭这些函数的定义。以上是在IAR移植FreeRTOS的大致过程。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [基于IAR平台FreeRTOS移植](https://blog.csdn.net/weixin_30411997/article/details/97783792)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [IAR软件移植FreeRTOS操作系统软件](https://blog.csdn.net/qq_41929416/article/details/120188581)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值