多线程——充分压榨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 芯片为精简指令集,其特点

  • RAM 只有读写指令

  • 数据的运算在 CPU 内部实现

  • CPU 复杂度低一点

arm 为哈佛结构,代码和数据走两条总线,取数据的时候可以取代码。

CPU 内部也可以临时存放数据,arm 的结构。

比如对于 a = a + b 这个 C 语言操作,步骤为

  • ldr r0, [a]

  • ldr r1, [b]

  • add r0, r0, r1

  • str r0, [a]

靠近硬件的操作使用汇编语言,汇编指令的含义也很靠近硬件,用起来查手册即可。这里给出一些常用的

  • 加载/存储指令

    • ldr r0,[addr] ;load register

      • ldrb

    • str r0,[addr] ;store register

最后更新于