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