复位中断
按下复位按键后,系统复位中断,从地址0x0000_0004开始执行代码。
复位中断发生后,执行的中断代码
先执行SystemInit函数,再执行main函数。
SystemInit里面就是对RCC时钟进行了一些操作。
main就是开始调用自己准备写的代码。
MDK中扩展关键字sub的用法
在执行main函数之前,需要执行一些逻辑。可以使用sub和super关键字来完成这个目标
//被Sub关键字修饰后-->执行main函数之前,执行这个函数(执行完成后不自动跳回main,需要手动)
int $Sub$$main(void)//components.c里
{
rtthread_startup();
return 0;
}
// $Super$$main()手动跳回main函数
void main_thread_entry(void *parameter)//components.c里
{
...
...
#if defined(__CC_ARM) || defined(__CLANG_ARM)
$Super$$main();
}
main之前进的RTT初始化
int rtthread_startup(void)
{
rt_hw_interrupt_disable();//关闭所有的中断
rt_hw_board_init();//板级初始化(内存堆初始化、初始化时钟 HAL库 串口设备 shell控制台设备 板级硬件)
rt_show_version();//打印当前RT系统的版本
rt_system_timer_init();//初始化系统定时器
rt_system_scheduler_init();//初始化系统调度器
#ifdef RT_USING_SIGNALS
rt_system_signal_init();//信号初始化
#endif
rt_application_init();.//创建一个用户main线程
rt_system_timer_thread_init();//初始化系统定时器线程
rt_thread_idle_init();//空闲线程初始化
rt_system_scheduler_start();//开调度器
return 0;
}