CH32V203移植FreeRTOS

本文介绍了如何获取并使用FreeRTOS2022.12版本,重点在于为RISC-V架构构建FreeRTOS核心,包括将源文件加入项目、设置中断堆栈、定义配置常量以及安装陷阱处理程序。遇到错误时,通过调整头文件路径和按照提示修改代码,最终成功实现多任务示例。
摘要由CSDN通过智能技术生成

1.获取内核:

网址是:https://www.freertos.org/zh-cn-cmn-s/a00104.html

最新的FreeRTOS是2022.12版本,我直接拿来用了 ,下载好后,解压,里面有两个文件夹建议好好看看,一个是例程demo,一个是你要用的 source

2.步骤

关于步骤,一个很重要的文章:FreeRTOS for RISC-V RV32 and RV64

要为 FreeRTOS 核心构建 RISC-V,必须:

  1. 把核心 FreeRTOS 源 文件和 FreeRTOS RISC-V 端口层源文件 纳入您的项目中
  2. 确保汇编器的包含路径 包括描述任何芯片特定实现细节 的头文件的路径
  3. 在 FreeRTOSConfig.h 或一个链接器变量中定义一个常量, 来指定要用作 中断堆栈的内存
  4. 定义 configMTIME_BASE_ADDRESS 和 configMTIMECMP_BASE_ADDRESS,位置为 FreeRTOSConfig.h
  5. 对于汇编器,#define(定义) portasmHANDLE_INTERRUPT 为您的芯片或工具供应商提供的,用于处理外部中断的函数的名称
  6. 安装 FreeRTOS 陷阱处理程序

如果这里面有些术语看不懂,可以去看看这位大佬的文章

https://www.cnblogs.com/JayWellsBlog/p/16502041.html 

然后大概就是照着走,一开始我是直接导入了整个source文件,然后被报错说没找到头文件,那就添加路径(连个不一样,注意区分):

 

加完了之后再编译可能还会报错,记不得了,但是照着他的说的改就好了

有一点需要注意

 这个顺序是不能乱的,一乱会报错

然后再编译一直修改就好了,我大概弄了一个晚上才弄好。

userpinmux.c


//8.FreeRTOS
#if  cmd_status_board==8
void GPIO_SYSTEM_INIT(void)
{
  GPIO_InitTypeDef  GPIO_INIT_7;

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
  GPIO_INIT_7.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_3;
  GPIO_INIT_7.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_INIT_7.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_INIT_7);
}

void MULTITASKING_TASKS1(void *pvParameters)
{
    printf("TASK1: LED1!\r\n");
    while(1)
    {
        GPIO_SetBits(GPIOA, GPIO_Pin_1);
        vTaskDelay(250);
        GPIO_ResetBits(GPIOA, GPIO_Pin_1);
        vTaskDelay(250);
    }
}

void MULTITASKING_TASKS2(void *pvParameters)
{
    printf("TASK2: LED2!\r\n");
    while(1)
    {
        GPIO_ResetBits(GPIOA, GPIO_Pin_3);
        vTaskDelay(500);
        GPIO_SetBits(GPIOA, GPIO_Pin_3);
        vTaskDelay(500);
    }
}
void MULTITASKING_TASKS_INIT(void)
{
GPIO_SYSTEM_INIT();
/* create two task */
xTaskCreate((TaskFunction_t )MULTITASKING_TASKS1,
                    (const char*    )"pcnames_task1",
                    (uint16_t       )TASK1_usstackdepth  ,
                    (void*          )NULL,
                    (UBaseType_t    )TASK1_priority,
                    (TaskHandle_t*  )&Task2Task_Handler);

xTaskCreate((TaskFunction_t )MULTITASKING_TASKS2,
                (const char*    )"pcnames_task2",
                (uint16_t       )TASK2_usstackdepth ,
                (void*          )NULL,
                (UBaseType_t    )TASK2_priority,
                (TaskHandle_t*  )&Task1Task_Handler);
vTaskStartScheduler();
}

#endif
//void pinmux_init() {
//    GPIO_InitTypeDef GPIO_INIT_1;
//    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
//    GPIO_INIT_1.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;
//    GPIO_INIT_1.GPIO_Mode = GPIO_Mode_Out_PP; //设置成推挽输出
//    GPIO_INIT_1.GPIO_Speed = GPIO_Speed_50MHz;
//    GPIO_Init(GPIOB, &GPIO_INIT_1);
//    GPIO_SetBits(GPIOB, GPIO_Pin_4);
//}

#endif /* USER_USERPINMUX_C_ */

 userpinmux.h

//FreeRTOS
#define TASK1_usstackdepth      256
#define TASK2_usstackdepth      256
#define TASK1_priority     5
#define TASK2_priority     5
//test_of_cmd 每做一次更新屏蔽上一层
#define cmd_status_board   8

main.c

void setup() {
    //*******系统默认**********//
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    Delay_Init();
    USART_Printf_Init(115200);
    //*************************//
    GPIO_SYSTEM_INIT();
    MULTITASKING_TASKS_INIT();}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值