查看: 4348|回复: 2

[原创] 【经验分享】zephyr运行图

[复制链接]

该用户从未签到

715

主题

6374

帖子

0

超级版主

Rank: 8Rank: 8

积分
25155
最后登录
2025-8-12
发表于 2021-8-30 10:57:34 | 显示全部楼层 |阅读模式
怎么看zephyr的代码?打开main函数,发现就几句代码,于是开始疑惑,mcu时钟在哪里初始化,引脚在哪里初始化,等等问题。我们使用frdm_k64板子,并且使用zephyr的led代码,来梳理整个zephyr运行的过程。
zephyr运行图.png
从哪里开始看?当然是从启动代码里开始看。
我们要到的终点就是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函数
回复

使用道具 举报

  • TA的每日心情
    慵懒
    2024-5-23 06:13
  • 签到天数: 1082 天

    连续签到: 1 天

    [LV.10]以坛为家III

    18

    主题

    1974

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    6191
    最后登录
    2025-8-13
    发表于 2021-9-1 09:05:24 | 显示全部楼层
    感谢分享!
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2025-5-15 09:29
  • 签到天数: 178 天

    连续签到: 1 天

    [LV.7]常住居民III

    11

    主题

    423

    帖子

    1

    金牌会员

    Rank: 6Rank: 6

    积分
    1392
    最后登录
    2025-5-15
    发表于 2021-9-4 11:46:34 | 显示全部楼层
    赞赞赞。。。。
    加油加油
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-8-14 04:25 , Processed in 0.083356 second(s), 22 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表