普誠創智(成都)科技有限公司-论坛

 找回密码
 立即注册
搜索
热搜: PT32 BLDCM Motor USB
查看: 63646|回复: 1
打印 上一主题 下一主题

基于PT32C302的FreeRTOS的移植步骤

[复制链接]

2

主题

3

帖子

246

积分

內部人

Rank: 5Rank: 5

积分
246
跳转到指定楼层
楼主
发表于 2017-9-19 10:41:30 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
第一步:准备模板及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移植完成。
回复

使用道具 举报

174

主题

198

帖子

1622

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1622
沙发
发表于 2017-9-19 17:27:43 | 只看该作者
good
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

蜀ICP备16008743号-1|普诚科技公司|小黑屋|普誠創智(成都)科技有限公司-论坛  

GMT+8, 2024-11-22 02:57 , Processed in 0.334605 second(s), 28 queries .

快速回复 返回顶部 返回列表