跳转至

阅读

读 x86 手册记录

常见看名字猜测不了功能的指令

lea //Load Effective Address

test //Logical Compare, Computes the bit-wise logical AND of first operand 
 //(source 1 operand) and the second operand (source 2 operand) and 
 //sets the SF, ZF, and PF status flags according to the result. The result is then discarded.

incl //Adds 1 to the destination operand, while preserving the state of the CF flag. 
  //The destination operand can be a register or a memory location. This instruction 
  //allows a loop counter to be updated without disturbing the CF flag. (Use a ADD 
  //instruction with an immediate operand of 1 to perform an increment operation that does updates the CF flag.)

linux 内核设计与实现阅读

linux 内核设计与实现(原书第 3 版), Robert Love

  • 一个内核由:负责响应中断的中断服务程序,负责多个程序分享处理器时间的进程调度程序,负责管理进程地址空间的内存管理程序和网络、进程间通信等系统服务程序组成。
  • 应用程序通过系统调用访问内核,内核运行于进程上下文中。(不同进程运行同样的内核代码,上下文不同,因此有不同效果)

    • 对于中断来说,内核运行于中断上下文
  • 单内核和微内核。linux 汲取了微内核的优点:linux 是模块化的,多线程的以及内核本身可调度的。
  • inline 函数必须用 static 修饰,涉及到编译,因为 inline 的含义有点像宏。而如果不用 static 修饰,那么其他文件的函数也可以调用它,那么就会导致不得不建立一个符号表项。因此声明为 static 实现起来更简单。
  • 内核使用的 C 语言用到了 ISO99 和 GUN C 扩展特性,其中几个用的比较广的 GUN C 扩展特性
    • 内联函数
    • 内联汇编

嵌入式技术基础与实践 第五版

心得

  1. 为什么单片机可以控制灯的亮灭,通用 PC 却没办法控制灯呢?(因为没有 CPU 到 LED 的接口也没有驱动程序)

  2. 中断向量机制和 MIPS 采用的统一入口地址不太一样。中断向量机制硬件产生中断请求时,中断号是确定了的(通过中断控制器发送中断号),软件可以配置对应中断服务程序。而 MIPS 没有中断号的概念,通过软件检查 Stastus 寄存器,来确定是哪一个中断,跳转到对应中断服务程序。

    中断向量机制的 CPU 通常需要一个中断控制器,连接在总线上。中断控制器会给 CPU 提供中断号。

  3. MCU 本质就是一个微型计算机,包含 CPU,存储器,I/O 接口(控制器模块)。嵌入式开发就是要基于 MCU 搭建一个硬件系统(通过 MCU 的 I/O 接口连接各种需要被控制的外设),并逐层向上编写构件(驱动),最后基于构件编写嵌入式应用,从而完成需要的功能。

  4. MCU 由于需要通用性,使得用户可以基于 MCU 去搭建自己的系统,驱动自己的外设,因此每个引脚都复用多个功能。通过配置 MCU 内对应控制器的寄存器来配置引脚的功能。

    比如 MSP432 100 个引脚中有 84 个可以配置成 GPIO 引脚。只需要将 MSP432 分配的 GPIO 寄存器中的 PxSEL0, PxSEL1 寄存器(x 表示端口号,有 11 个端口 P1~P10 和 PJ)都置为 0 时,该端口的引脚即为 GPIO 功能。同样可以通过配置 GPIO 寄存器控制引脚方向作为输入还是输出,用于点亮 LED 灯或者接受开关输入。

    再比如 MSP432 有 4 个增强型通用串行通信接口模块 (eUSCI),也分配了若干寄存器。通过配置寄存器可以将对应引脚配置为 UART 的引脚或 SPI 的引脚。

    但是我们在 FPGA 上搭建 SoC 时,开发板上的灯、拨码开关和 FGPA 芯片的引脚是连好了的(由开发板的提供商基于 FPGA 芯片搭建),也就是说每个引脚作为输入还是输出是已经确定了的。我们能改变的只是——是否使用该外设。当然,不排除保留了一些引脚被接到扩展插口上(那一排排的黑色插孔)。因此在 FPGA 上搭建 SoC 后,实现外设驱动需要对外设的控制器进行配置。而嵌入式开发还多出了配置 MCU 内用于复用的模块寄存器。