多线程——充分压榨MCU能力
MCU的使用方式。
无操作系统的单片机系统被叫做裸机系统。开发者直接操作硬件,给人的感觉就很硬,很直接。
裸机系统结构很简单,没有特别复杂的思维模式。逻辑系统又有轮询系统和前后台系统。
轮询系统的典型结构
int main(void)
{
/* 外设寄存器配置 */
HardWareInit();
while(1)
{
/* 任务1 */
function1();
/* 任务2 */
function2();
}
}
前后台系统在轮询的基础上加入了中断,中断为前台,轮询为后台
int main(void)
{
/* 外设寄存器配置 */
HardWareInit();
while(1)
{
/* 任务1 */
function1();
/* 任务2 */
function2();
}
}
void ISR1(void)
{
}
在一些简单的场合,设计一个精妙中断嵌套的前后台程序也足够用了。经典的例子比如使用STM32进行的电机控制。
在实时操作系统的系统里,把一个个功能分成独立的部分,称为线程。
第一个问题是线程切换。
程序是状态机,线程之间互不干扰,每个线程都是独立的状态机。
线程切换前保存现在状态机的状态,加载要切换的线程的状态,继续运行。
一个 C 语言程序的状态包括局部变量、寄存器的值。
即栈和寄存器。
因此需要稍稍了解一下 arm 架构和汇编。
arm 芯片为精简指令集,其特点
arm 为哈佛结构,代码和数据走两条总线,取数据的时候可以取代码。
CPU 内部也可以临时存放数据,arm 的结构。
比如对于 a = a + b 这个 C 语言操作,步骤为
靠近硬件的操作使用汇编语言,汇编指令的含义也很靠近硬件,用起来查手册即可。这里给出一些常用的
加载/存储指令
ldr r0,[addr] ;load register
str r0,[addr] ;store register