链接:FreeRTOS
下面的教程是基于从github下载压缩包进行的,最好下载这个或者直接看3.1,从我百度网盘下载。如果是别的下载源也问题不大,大同小异。
此时我们需要下载以下两个仓库,
点进去按下面的步骤下载就行了,另一个也是这样下。
链接: FreeRTOS官网
打开链接我们可以看到有两个下载选项,我们下载第一个就行。
下载速度较慢。
链接:https://pan.baidu.com/s/1x00zgnJfCae75DpJ1W4RIg?pwd=1233
提取码:1233
若上述都不行可以直接私信。
在keil中点击魔术棒,进入“C/C++”,在Include Paths中添加FreeRTO、src、inc、port路径。
按下面的操作分别添加src文件夹和port文件夹下的所有.c文件
#define xPortPendSVHandler PendSV_Handler
#define vPortSVCHandler SVC_Handler
#define xPortSysTickHandler SysTick_Handler
注释掉以下几个函数
void SVC_Handler(void);
void PendSV_Handler(void);
void SysTick_Handler(void);
我们简单写一个让STM32F103C8T6最小系统板上led灯闪烁的程序测试下。
#include "freertos.h"
#include "task.h"
#include "timers.h"
void Led_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
}
void Led_Task(void *pvParams)
{
Led_Init();
while(1)
{
GPIO_ResetBits(GPIOC,GPIO_Pin_13);
vTaskDelay(500);
GPIO_SetBits(GPIOC,GPIO_Pin_13);
vTaskDelay(500);
}
}
int main(void)
{
xTaskCreate(Led_Task,"ledtask",128,NULL,12,NULL);
vTaskStartScheduler();
}
main文件中的全部代码为
#include "stm32f10x.h" // Device header
#include "freertos.h"
#include "task.h"
#include "timers.h"
void Led_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
}
void Led_Task(void *pvParams)
{
Led_Init();
while(1)
{
GPIO_ResetBits(GPIOC,GPIO_Pin_13);
vTaskDelay(500);
GPIO_SetBits(GPIOC,GPIO_Pin_13);
vTaskDelay(500);
}
}
int main(void)
{
xTaskCreate(Led_Task,"ledtask",128,NULL,12,NULL);
vTaskStartScheduler();
}
链接:https://pan.baidu.com/s/1E_bi4nIzayskaVl3YrLBGA?pwd=1233
提取码:1233
需要注意的是Stm32F103C8T6的SRAM仅有20KB,而我们移植的FreeRTOS默认占用了17KB来作为自己的堆,所以我们写不了多少程序就会出现内存超出无法编译的情况。
故我们需要手动将configTOTAL_HEAP_SIZE调小些。如:
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 8 * 1024 ) )