在线时间2226 小时
UID3253523
注册时间2016-3-21
NXP金币3208
该用户从未签到
超级版主
 
- 积分
- 25155
- 最后登录
- 2025-8-12
|
怎么看zephyr的代码?打开main函数,发现就几句代码,于是开始疑惑,mcu时钟在哪里初始化,引脚在哪里初始化,等等问题。我们使用frdm_k64板子,并且使用zephyr的led代码,来梳理整个zephyr运行的过程。
从哪里开始看?当然是从启动代码里开始看。
我们要到的终点就是main函数,启动文件里有很多条件编译的汇编代码,我们暂时先不管,首先就是看门狗始化,在这之后就是跳转z_arm_prep_c,而这个函数我们需要关注的就是函数z_cstart,在这函数里面开始对zephyr的内核,线程外设进行初始化。
zephyr进行系统级初始化时候只需要调用z_sys_init_run_level,zephyr如何知道要初始化那些资源呢?这些都是首先使用SYS_INIT进行注册,第一个参数是初始化函数的地址,第三个则是初始化的优先级。mcu要运行起来,重中之重就是时钟初始化。在这图片里可以看到,k6x_init执行了时钟初始化,并且优先级是0。。第二个参数有几种不同的值,其中PRE_KERNEL_1表示的是,这个初始化并不需要其他依赖,比如说时钟初始化,并不需要依赖其他什么库,只需要配置硬件的寄存器就可以完成初始化。引脚初始化也是同样,串口打印也需要首先初始化,之后肯定要被其他资源调用的。
PRE_KERNEL_2则是需要依赖于PRE_KERNEL_1的初始化,比如系统滴答时钟,如果前面时钟没有启动起来,这个滴答时钟是没办法用的。
z_sys_init_run_level首先初始化PRE_KERNEL_1的外设,然后初始化PRE_KERNEL_2的外设。
z_cstart最后就是创建一个main线程,然后在进main函数之前,还要初始化post kernel和application,post kernel初始化那些需要内核服务的应用,application则是各种应用的初始化,最终到达了main函数
|
|