1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
RT-thread内核文档学习<一>内核基础
Rtthread的初始化过程 纯属个人学习笔记,敬请指正 一、系统初始化 首先初始化会进入一个被Sub和super修饰的main函数,由于我从来没有见过于是就看了官方的文档,做出了如下总结。 1.1 扩展补丁Sub和super的作用 **∗ ∗ s u p e r ∗ ∗ ** super**∗∗super∗∗∗ ∗ f o o 和 ∗ ∗ **foo 和 **∗∗foo和∗∗Sub$$**foo的使用方法如下 例如,如果它位于外部库中或ROM代码中,则无法修改现有符号。 在这种情况下,您可以使用 Super 和 sub 模式来修补现有符号。 修补函数foo()的定义: **∗ ∗ s u p e r ∗ ∗ ** super**∗∗super∗∗$**foo():为原始未扩展的函数foo()。 使用它直接调用原始函数。 **∗ ∗ S u b ∗ ∗ **Sub**∗∗Sub∗∗$**foo():为的新函数而不是原始函数foo()。可以在此函数对super函数进行一些额外的处理。 注意:Sub和Super机制仅在静态链路时间工作,不能导入或导出到动态符号表中。 例如:以下示例显示了如何使用$ super KaTeX parse error: Can't use function '$' in math mode at position 2: 和$̲ sub ,以在调用传统功能foo()之前插入函数Extrafunc()的调用。 void Extrafunc(void);//额外的功能调用 void $ super $$ foo(void):/ *此函数称为原始foo()* / void $ sub $$ foo(void) { Extrafunc(); / *是否有一些额外的设置工作* / $ super $$ foo(); / *调用原始foo()函数* / /*避免调用原始foo()函数 *省略$ super $$ foo(); 函数调用。 */ } 首先以我的理解来描述一下这个补丁的作用:可以说这是在原有函数不改变的前提下,对函数的扩展或重写的一种方法 接着就正真开始系统的启动开始: int rtthread_startup(void) { rt_hw_interrupt_disable(); /* board level initialization * NOTE: please initialize heap inside board initialization. */ rt_hw_board_init(); /* show RT-Thread version */ rt_show_version(); /* timer system initialization */ rt_system_timer_init(); /* scheduler system initialization */ rt_system_scheduler_init(); #ifdef RT_USING_SIGNALS /* signal system initialization */ rt_system_signal_init(); #endif /* create init_thread */ rt_application_init(); /* timer thread initialization */ rt_system_timer_thread_init(); /* idle thread initialization */ rt_thread_idle_init(); #ifdef RT_USING_SMP rt_hw_spin_lock(&_cpus_lock); #endif /*RT_USING_SMP*/ /* start scheduler */ rt_system_scheduler_start(); /* never reach here */ return 0; }
我来总结一下到目前为止,系统都做了些什么工作:到这里系统内核的初始化已经全部启动完毕了,接下来就是三个线程对系统的调度了,套娃模式开启,线程中操作其他线程的创建和删除,多美妙呀!!!如图:(图示例中的其他线程,具体我不了解,在我的理解是可能在之前的初始化中,用户创建了新的线程,也可能是main函数中创建的线程也开始进入了系统的调度) 我们来看看main函数的入口函数的执行: void main_thread_entry(void *parameter) { extern int main(void); extern int $Super$$main(void); #ifdef RT_USING_COMPONENTS_INIT /* RT-Thread components initialization */ rt_components_init(); #endif #ifdef RT_USING_SMP rt_hw_secondary_cpu_up(); #endif /* invoke system main function */ #if defined(__CC_ARM) || defined(__CLANG_ARM) $Super$$main(); /* for ARMCC. */ #elif defined(__ICCARM__) || defined(__GNUC__) main(); #endif }
接近尾声了,最后要做的就是在不同的线程中完成要做的任务,以及信息处理IPC的工作了,我们下次再进行讨论,时间不早了,我也该睡觉了Zzz! |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1820 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1634 浏览 1 评论
1104 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
740 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1692 浏览 2 评论
1951浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
756浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
587浏览 3评论
605浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
570浏览 3评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-31 02:24 , Processed in 0.538980 second(s), Total 46, Slave 40 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号