抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

堆和栈

返回地址保存在栈中

添加串口打印功能

  • 去掉无关代码、LCD等

  • 增加串口打印功能

    • 初始化串口
    • 实现fputc

标准库移植

将官方标准库移植到STM32F103C8T6

常见变量类型

TaskHandle_t​是任务句柄类型,指针类型,原型为void *

StackType_t​是任务堆栈类型,整型类型,原型为uint32_t

StackTask_t​是任务块类型,结构体,原型为xSTATIC_TCB​结构体

移植注意事项

FreeRTOSConfig.h

配置中断服务

1
2
3
4
5
6
/****************************************************************
FreeRTOS与中断服务函数有关的配置选项,映射端口
****************************************************************/

#define xPortPendSVHandler PendSV_Handler
#define vPortSVCHandler SVC_Handler

Serial.c

注意串口波特率一致性

尽量使用printf​而不使用自定义Serial_Printf

main.c

注意开启vTaskStartScheduler

创建任务

静态SARM内存

需要开启静态内存

1
2
//支持静态内存
#define configSUPPORT_STATIC_ALLOCATION 1

静态内存任务开启区函数

1
2
3
4
5
6
7
LEDTask_Handle = xTaskCreateStatic((TaskFunction_t)LED_Task,	//任务LED
(const char*)"LED_Task", //任务名
(uint32_t)128, //堆栈大小
(void*)NULL, //传给函数的参数
(UBaseType_t)4, //任务优先级
(StackType_t *)LED_Task_Stack, //任务堆栈
(StaticTask_t *)&LED_Task_TCB); //任务控制块

动态SARM内存

不开启静态内存

动态内存任务开启函数

1
2
3
4
5
6
xReturn = xTaskCreate((TaskFunction_t)LED_Task,		//任务LED
(const char*)"LED_Task", //任务名
(uint16_t)512, //堆栈大小
(void*)NULL, //传给函数的参数
(UBaseType_t)2, //任务优先级
(TaskHandle_t *)&LEDTask_Handle);//任务控制块指针

注意动态和静态的开启函数区别,参数不同,参数类型也不同。

多任务

多任务相较于单任务,区别只在任务开启的个数,对应参数填好,开启任务即可实现多任务。