1、Reset_Handler
系统上电后第一个执行的汇编函数,系统通过该函数进行初始化
1 Reset_Handler PROC
2 EXPORT Reset_Handler [WEAK]
3 IMPORT __main
4 IMPORT SystemInit
5 LDR R0, =SystemInit
6 BLX R0
7 LDR R0, =__main
8 BX R0
9 ENDP
2、__main
C库函数,系统初始化后会调用该函数,从而执行C代码
3、main()
main函数是C语言的代码第一个执行的函数,一般操作系统的创建与启动都在main函数中调用。
int main(void)
{
BaseType_t xReturn = pdPASS;/* 定义一个创建信息返回值,默认为 pdPASS */
/* 开发板硬件初始化 */
BSP_Init();
taskENTER_CRITICAL(); //进入临界区
/* 创建 AppTaskCreate 任务 */
xReturn = xTaskCreate((TaskFunction_t )AppTaskCreate,/* 任务入口函数 */
(const char* )"AppTaskCreate",/* 任务名字 */
(uint16_t )512, /* 任务栈大小 */
(void* )NULL,/* 任务入口函数参数 */
(UBaseType_t )1, /* 任务的优先级 */
(TaskHandle_t*)&AppTaskCreate_Handle);/*任务控制块指针*/
taskEXIT_CRITICAL(); //退出临界区
/* 启动任务调度 */
if (pdPASS == xReturn)
vTaskStartScheduler(); /* 启动任务,开启调度 */ (3)
else
return -1;
while (1); /* 正常不会执行到这里 */
}
4、创建任务
通过调用FreeRTOS 的任务创建函数创建任务,在任务创建中,FreeRTOS会自动进行一系列的操作系统初始化,比如初始化内存等。
//创建任务函数原型
BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,
const char * const pcName,
const uint16_t usStackDepth,
void * const pvParameters,
UBaseType_t uxPriority,
TaskHandle_t * const pxCreatedTask )
5、启动任务
在创建完任务的时候,我们需要开启调度器,因为创建仅仅是把任务添加到系统中,还没真正调度,并且空闲任务也没实现,定时器任务也没实现,这些都是在开启调度函数vTaskStartScheduler()中实现的。
为什么要空闲任务?因为 FreeRTOS 一旦启动,就必须要保证系统中每时每刻都有一个任务处于运行态(Runing),并且空闲任务不可以被挂起与删除,空闲任务的优先级是最低的,以便系统中其他任务能随时抢占空闲任务的 CPU 使用权。
这些都是系统必要的东西,也无需用户自己实现,FreeRTOS 全部帮我们搞定了。处理完这些必要的东西之后,系统才真正开始启动。
参考
野火FreeRTOS内核实现与应用开发实战