以stm32f4xx板子为例,在board\stm32f429zi-nucleo\startup_stm32f429xx.s 中定义的Reset_Handler 指向main函数,main函数入口在:
AliOS-Things_stm32f429zi-nucleo_2858\AliOS-Things\platform\mcu\stm32f4xx_cube\aos\aos.c中,其中的代码如下:
static void sys_init(void)
{
stm32_peripheral_init();
#ifdef BOOTLOADER
main();
#else
hw_start_hal();
board_init();
var_init();
aos_components_init(&kinit);
#ifndef AOS_BINS
application_start(kinit.argc, kinit.argv); /* jump to app/example entry */
#endif
#endif
}
static void sys_start(void)
{
aos_heap_set();
stm32_soc_init();
aos_init();
krhino_task_create(&demo_task_obj, "aos-init", 0,AOS_DEFAULT_APP_PRI, 0, demo_task_buf, AOS_START_STACK, (task_entry_t)sys_init, 1);
aos_start();
}
int main(void)
{
sys_start();
return 0;
}
调用关系为:main-》sys_start-》sys_init
其中,sys_start函数做了如下工作:
[if !supportLists]1)[endif]aos_heap_set(); //设置堆大小
[if !supportLists]2)[endif]stm32_soc_init(); //硬件初始化,比如欲取指、I-cache、D-cache,中断组优先级,设置系统时间滴答为1ms,低层级硬件设置等
[if !supportLists]3)[endif]SystemClock_Config(); //Initializes the CPU, AHB and APB busses clocks
[if !supportLists]4)[endif]aos_init(); //操作系统初始化,没有细看,主要是创建系统队列,列表,和信号量等系统所需资源并启动idle任务,并对任务堆栈进行初始化
[if !supportLists]5)[endif]sys_init(); //创建初始化任务,后续讲解
[if !supportLists]6)[endif]aos_start(); //系统运行,调度任务开始
我们来看下sys_init任务做了什么:
[if !supportLists]1) [endif]stm32_peripheral_init(); //外围总线初始化,iic/uart等
[if !supportLists]2) [endif]hw_start_hal(); //硬件初始化,根据所选组件而不同,我的组件中是初始化wifi模组
[if !supportLists]3) [endif]board_init(); //板子初始化,主要是存储区的读写属性等
[if !supportLists]4) [endif]var_init(); //变量初始化,主要是设置真正的main函数的参数
[if !supportLists]5) [endif]aos_components_init(&kinit); //组件初始化,根据编译时候所选组件而不同
[if !supportLists]6) [endif]application_start(kinit.argc, kinit.argv); //跳转到实例代码运行
在这个函数中比较重要的就是这句:
aos_register_event_filter(EV_WIFI, wifi_service_event, NULL);
将wifi的事件注册到回调函数wifi_service_event中,这个回调会在第一次调用的时候,创建一个新的任务:
if (!linkkit_started) {
aos_task_new("iotx_example", (task_fun)linkkit_main, (void *)&entry_paras, 1024 * 6);
linkkit_started = 1;
}
这里创建了linkkit_main任务,,这个任务在app\example\mqttapp\mqtt_example.c文件中,主要是创建了一个mqtt client信息,并发送给server,不详细介绍了。