一.移植前的准备
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, //形参