本帖最后由 yuyy1989 于 2024-6-26 21:21 编辑
FreeRTOS是一个实时操作系统,适用于微控制器和微处理器,使小型低功耗设备的编程变得更容易。下载的例程里没有FreeRTOS的例程需要自己移植,先下载FreeRTOS核心源码 https://github.com/FreeRTOS/FreeRTOS-Kernel/releases
创建一个FreeRTOS的文件夹
打开下载的FreeRTOS核心源码,将FreeRTOS-KernelV11.1.0的全部文件解压到刚才创建的FreeRTOS文件夹
在Keil中创建FreeRTOS分组,将FreeRTOS文件夹下的.c文件添加到分组中
FreeRTOS官方还没有对STAR-MC1核心进行适配,这里选择CM33,因为官方也没有介绍说有TrustZone所以选择ARM_CM33_NTZ,将portable\GCC\ARM_CM33_NTZ\non_secure中的port.c和portasm.c添加到分组中
还需要添加MemMang中的内存管理代码,这里有5个
打开那个readme看看
这里使用heap4.c就行,把它添加到工程中,然后添加FreeRTOS的头文件路径
其他用不到的文件和文件夹就可以删掉了,在FreeRTOS的官方例程里复制1个FreeRTOSConfig.h文件到代码文件夹(我用的CORTEX_MPU_M33F_NTZ_Nordic_NRF9160_SES这个例程),最后结构是这样
修改一下FreeRTOSConfig.h内容,修改下面几个宏定义
注意一下如果你的项目已经实现了SVCall_Handler、PendSV_Handler、SysTick_Handler需要将它们删掉,后面由FreeRTOS来接管,接下来创建FreeRTOS任务,两个LED以不同速度闪烁的任务和一个定时通过串口打印的任务,LED初始化、串口初始化和printf重定向到串口的代码就不放了,之前的帖子里都有
static TaskHandle_t led1_task_handler = NULL;
static TaskHandle_t led2_task_handler = NULL;
static TaskHandle_t printf_task_handler = NULL;
static void Led1Task(void* pvParameters)
{
while (1)
{
led_toggle(LED_NO_1);
vTaskDelay(200);
}
}
static void Led2Task(void* pvParameters)
{
while (1)
{
led_toggle(LED_NO_2);
vTaskDelay(500);
}
}
static void PrintfTask(void* pvParameters)
{
uint8_t i = 0;
while (1)
{
vTaskDelay(1000);
i+=1;
printf("PrintfTask i = %d\n",i);
}
}
int main(void)
{
uart_init();
led_init();
printf("MM32F5330 FreeRTOS\n");
xTaskCreate(Led1Task, "Led1Task", configMINIMAL_STACK_SIZE, NULL,1, &led1_task_handler);
xTaskCreate(Led2Task, "Led2Task", configMINIMAL_STACK_SIZE, NULL,1, &led2_task_handler);
xTaskCreate(PrintfTask, "PrintfTask", configMINIMAL_STACK_SIZE, NULL,1, &printf_task_handler);
vTaskStartScheduler();
while (1)
{
}
}
LED任务运行效果
Printf任务运行效果
|