章节列表

内核编程实践

2018-05-29 03:39:42 +0000 李述铜

Hi,欢迎回来!从本课时开始,你需要动手开始编程!

在这里,我们通过一个小的编程代码熟悉前一节课时中介绍的《芯片内核介绍》,同时也会为下一步讲解任务切换原理做一个铺垫

特别注意:本课时难度较大,需要花很多时间学习!

主要内容

课时中主要通过编写代码、编译、调试来完成一个功能流程。这个流程接下来的《任务切换的实现》非常相似。所以,如果你现在对这个流程搞不明白其具体为什么是这样,没有关系,就当其是个要求实现的流程即可。

这个流程如下:

  • 初始化时,使用blockptr指针变量指向了一个缓冲区空间
  • 在主循环中,不断地对flag进行翻转。同时手动触发pendsvc异常
  • 在pendsvc异常处理函数中
    • 通过stmdb将r4-r11寄存器的内容压到缓冲区中,保存的起始位置为blockptr->stackPtr;
    • 再将最后缓冲区的地址写回到blockptr->stackPtr中
    • 最后通过ldmia将刚才保存到缓冲区r4-r11值恢复到r4-r11寄存器

在后面的课时你会看到,这个流程跟任务切换流程是非常相似的。对比如下:

  • 初始化时,我们的任务初始化一个堆栈空间
  • 在需要任务切换时,手动触发pendsvc异常
  • 在pendsvc异常处理函数中
    • 通过stmdb将r4-r11寄存器的内容压到当前任务栈中,保存的起始位置为PSP指向的位置;
    • 再将最后PSP的值写回到task->Stack中
    • 最后通过ldmia将下一任务的堆栈中保存的r4-r11值恢复到r4-r11寄存器 对于这个流程的对比,请在学习下一节课《任务切换的实现》时,再回顾。

重点难点

本课时的难点在于理解从触发pendsvc异常,进入pendsvc,各指令的意义和功能,到最后退出异常整个流程中的软硬件工作过程。具体来说有以下几点:

  • 触发pendsvc异常。请参考上一节课时《芯片内核简介》
  • 进入pendsvc异常后的工作流程。硬件在进入/退出异常时,会自动保存恢复一部分寄存器(请参考上一节课时《芯片内核简介》)
  • 具体的指令含义。主要是怎样通过LDR/STR指令对指针及其指向的空间进行读写操作。

据以往同学反馈,问题多出现在pendsvc异常处理函数中的汇编指令理解上,此部分请参考PendSV_Handler代码详解注释,看不懂的请见这里。如有其它疑问,请见下方的常风问题

注意事项

本课时很难但是很重要,是理解任务切换实现的必备硬件基础,必须掌握。

虽然要花很多时间,但是值得付出!加油!

以下是学员最常问的问题:

此外,关于汇编部分,请参考这里,有非常详细的说明。

常见问题