|
第一步:准备模板及RTOS源码
在C302的例程中取出GPIO例程作为移植的模板。
在FreeRTOS官网中下载FreeRTOSv9.0.0.exe并解压,我移植版本也为9.0.0
第二步:移植过程
1、在C302例程中新建文件夹FreeRTOS用于存放FreeRTOS的系统文件
2、拷贝系统文件到FreeRTOS文件夹
1)从FreeRTOSv9.0.0的源文件中找到:croutine.c、list.c、queue.c、tasks.c、timers.c 源文件
位置:\FreeRTOSv9.0.0\FreeRTOS\Source
2)从FreeRTOSv9.0.0的源文件中找到:port.c、portmacro.h 源文件
位置:\FreeRTOSv9.0.0\FreeRTOS\Source\portable\RVDS\ARM_CM0
3)从FreeRTOSv9.0.0的源文件中找到:heap_1.c 源文件
位置:\FreeRTOSv9.0.0\FreeRTOS\Source\portable\MemMang
4)从FreeRTOSv9.0.0的源文件中找到:include等源文件
位置:\FreeRTOSv9.0.0\FreeRTOS\Source\include
5)寻找FreeRTOSConfig.h配置文件,因每个芯片配置不同,所以可以直接在FreeRTOS例程中拷贝一个FreeRTOSConfig.h,修改后使用。
在Demo中找到cortex-M0的例程,拷贝FreeRTOSConfig.h文件。
位置:\FreeRTOSv9.0.0\FreeRTOS\Demo\CORTEX_M0_STM32F0518_IAR
3、在Keil中将拷贝过来的文件添加到工程中,建立includes.h文件存放FreeRTOS头文件,添加代码如下。
#ifndef _INCLUDES_H
#define _INCLUDES_H
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "list.h"
#include "portable.h"
#include "FreeRTOSConfig.h"
#endif
将此文件包含到main.c文件中。
4、修改FreeRTOSConfig.h配置文件。
添加代码如下
#include "pt32c302.h"
#include <stdint.h>
extern uLONG SystemFrequency_SysClk;
修改代码如下
#define configUSE_TICK_HOOK 0 //时间片钩子函数 youke
#define configCPU_CLOCK_HZ ( SystemFrequency_SysClk ) //youke
#define configTICK_RATE_HZ ( ( TickType_t ) 1000 )
#define configMAX_PRIORITIES ( 4 ) //youke
#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 128 ) //youke
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( SRAMTOP - 1024) ) //youke
#define configMAX_TASK_NAME_LEN ( 16 ) //youke
#define configUSE_TRACE_FACILITY 0 //youke
#define configCHECK_FOR_STACK_OVERFLOW 0 //youke
#define configUSE_RECURSIVE_MUTEXES 1
#define configUSE_MALLOC_FAILED_HOOK 0 //youke 内存分配失败钩子函数
#define configUSE_TIMERS 0 //youke
#define configTIMER_TASK_STACK_DEPTH ( configMINIMAL_STACK_SIZE ) //youke
5、创建任务
打开main.c 创建两任务
代码如下:
//-------------------------------------
void vTask1(void *pvParameters) //GPIOA 取反 500ms
{
uCHAR i = 0;
while(1)
{
i = ~i;
if(i)
{
GPIOPortWr(GPIOA,0xFFFF);
}
else
{
GPIOPortWr(GPIOA,0x0000);
}
printf("vTask1 Run\r\n");
vTaskDelay(500);
}
}
//-------------------------------------
void vTask2(void *pvParameters) //GPIOC 取反 1000ms
{
uCHAR i = 0;
while(1)
{
i = ~i;
if(i)
{
GPIOPortWr(GPIOC,0xFFFF);
}
else
{
GPIOPortWr(GPIOC,0x0000);
}
printf("vTask2 Run\r\n");
vTaskDelay(1000);
}
}
//---------------------------
在main()中,注释掉TICKConfig();
while(1)中程序注释掉。
在打印完系统信息后添加:
xTaskCreate(vTask1,"Task11",50,NULL,1,NULL);
xTaskCreate(vTask2,"Task22",50,NULL,1,NULL);
vTaskStartScheduler(); //开启调度
编译下载
串口会打印如下信息及频率
vTask1 Run 500ms/次
vTask2 Run 1000ms/次
用示波器或逻辑分析仪采集输出GPIOA、GPIOC
GPIOA 500ms翻转
GPIOC 1000ms翻转
至此FreeRTOS移植完成。
|
|