[恒玄BES - 2700] main函数与系统初始化
一、文件结构
apps:主要存储上层应用程序相关软件,battery、key等等上层应用服务都在此目录中。
bthost:其中存放经典蓝牙和ble相关的协议。
config:表示基本的差异化配置。
include:RTOS相关的头文件。
lib:BES相关的库。
mbed:Mbed相关的配置文件
multimedia:多媒体相关的配置文件
out:存储编译输出的文件,选择".bin"文件输出,烧录时选择的.bin文件就保存在此目录中。
platform:其中主要包含驱动代码和CMSIS代码。
rtos:RTOS源文件,BES使用的是RXT RTOS(实时操作系统),并且使用了CMSIS_RTOS进行API封装。
scripts:其中包含构建框架脚本。
services:其中包含服务代码。
tests:其中包含测试程序。
thirdparty:其中包含第三方库。
tools:其中存放客制化的脚本文件。
utils:其中包含常见的实用程序代码。
针对不同公司的定制需求,其中的目录结构可能会有所变化,实际按照BES原厂提供的SDK包为准。但大体的结构保持与基本功能不过发生较大变化。
二、main函数
参考了一下其他博客(见附录),说程序入口在RTX_CM_LIB.H里面的_main_init()中,但是我编译了一下这个函数并没有运行到,可能是由于根据不同的公司函数入口不同?( = = 我只是猜测一些,欢迎指正)。但是最终的主线程还是运行到main()中,此函数进行硬件和系统初始化。
入口main函数位于/platform/main/main.cpp中。
浅析main函数
在main函数中会进行各种硬件的初始化工作,然后是串口的初始化(默认DEBUG_PORT == 1),进行打印日志输出的初始化。在uart初始化完成后会打印当前软件、芯片、flash分区大小等信息。
在串口相关操作初始化完毕后,软件运行会判断当前flash实际大小与软件定义是否匹配,如果软件定义的flash size 超过芯片自带flash大小,就会打印输出。
Wrong FLASH_SIZE defined in target.mk!
FLASH_SIZE is defined as 0x%x while the actual chip flash size is 0x%x!
Please change the FLASH_SIZE in common.mk to 0x%x to enable the OTA feature.
随后进行ASSERT无限循环死机,如下图所示。如果flash无异常后续就会启动硬件IO配置和模拟输入输出IO配置。
pmu_open();
analog_open();
在main函数中还有两个比较重要的点,app_init()和loop()函数。
1. app_init()
在main函数中有一个app_init(),main函数主要进行系统级初始化,而app_init在系统初始化完毕后进行应用层的初始化,其中还包括任务注册调度。在app_init中可放入各种外设的初始化,并且蓝牙初始化线程的创建也在app_init()。具体BesbtThread线程的工作,我会放到后面的章节讲,因为超过本章的范围了,先挖个坑 哈哈。
蓝牙初始化线程创建:
app_init() -> bes_bt_thread_init() -> BesbtInit() -> besbt_tid = osThreadCreate(osThread(BesbtThread), NULL);
2. loop函数
在main函数最后有一个loop函数,在程序初始化完成后进行死循环,其主要控制系统的开机和重启,如上图所示。此loop函数中,线程一直在等待接收任意一个信号量。
evt = osSignalWait(0x0, osWaitForever); // 等待接收任意任务通知
evt.value.signals & 0x08 == true时进行系统重启
其他情况进行系统关机
附言
由于BES的代码作者也接触不久,有很多不完善的地方欢迎大家多多指正。目录内容作者会慢慢填充可以关注下再走,感谢~~~~