|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区
您需要 登录 才可以下载或查看,没有账号?立即注册
×
抛开底层相关的启动函数等等,我们可以简单的理解C语言程序的入口为一个main函数。系统运行这个程序后,调用main函数,执行我们所写的代码。当函数执行完毕,main函数返回后,程序结束,操作系统相关的管理器会释放掉程序运行时候所占用的内存,供新的程序使用。具体执行前操作系统需要读取文件头等等,经过一系列的流程。不在这里讨论范围,有兴趣可以去查询相关资料。
而STM32的程序则简单的多。简化叙述流程就是,上电后,由底层的汇编文件去初始化堆栈,初始化中断向量表和相关的Handle等等,做完一系列初始化的工作,调用main函数。然后执行HAL库层面的初始化,比如配置引脚,配置时钟等等。最后进入一个死循环。此后程序便完全顺着中断和死循环内定义的东西去执行了。如果死循环退出,执行完main函数,会顺着Flash里面储存的代码数据,执行下一条指令,这使得程序变得不可控了。因此main里面的while(1)不能省略。哪怕你的程序完全由中断调度实现,主循环里面不需要任何东西。
某种程度上可以理解为在单片机里面跑的程序,永远没有结束,除非断电或Reset或其他特殊情形。
STM32的程序也是由C语言写的,因此,二者在变量,运算符,函数声明等等方面是相同的。你只需要像写电脑程序那样,去写STM32的程序即可。比如在main.c里面声明一个变量,那么无论是在电脑上的程序,还是STM32,main函数都可以访问,修改这个变量,其他文件如果extern了,相关函数也能看到。
但需要注意的是,STM32的RAM空间有限,对于一些非常小的MCU,不可能像电脑那样随意建一个4096的缓冲区。需要注意合理的内存分配,必要时使用malloc手动接管内存分配以免溢出。
此外指针操作需要尤其注意,STM32没有完善的内存保护机制,编译器很可能不告诉你诸如数组越界等Bug,导致你错误的读取或修改一些或许很重要的内存,这些BUG时常会引起一些匪夷所思的问题,比如莫名其妙跳到了ErrorHandle。遇到这类问题一定要先排查。 |
|