嵌入式学习路线和ROTS开发模式(1)

1.基础内功:

C语言,C++;数字电路,模拟电路;英语,看懂芯片手册;万用表,示波器工具等

2.就业方向:

单片机裸机,单片机RTOS,linux驱动,linux应用,DSP,FPGA;

3. 主流芯片架构:

ARM:

A应用程序类型:

经典ARM处理器: ARM926系统(ARMv5结构) ARM11系列(ARMv6系列)

ARM Cortex处理器: Cortex-A8 , Cortex-A9,....A35等

R实时控制器类型:

经典ARM处理器: ARM920系列(ARMv4结构), ARM966(ARMv5结构)

ARM Cortex处理器:Cortex-R3,R5,R7,R8,R52

M微控制器类型:

经典ARM处理器: ARM7系列(ARMv3结构)

ARM Cortex处理器:Cortex-M0,Coretx-M1(FPGA), M3,M4,M7,M23.M33

mcu: ram (自带)+mcu+flash(自带);

mpu: ram (外挂)+ flash(外挂)+mpu

RTOS:

Real-time operating system,实时操作系统。

 汇编指令:

* 读内存:Load,LDR
* 写内存:Store,STR
* 加法:ADD
* 入栈:PUSH,实质上就是写内存STR
* 出栈:POP,实质上就是读内存LDR

要读内存:读内存哪个地址?读到的数据保存在哪里?读多少字节?

* LDR R0, [R1, #0x00]
  * 源地址:R1+0x00,注意:不是读R1,是把R1的值当做内存的地址
  * 目的:R0,CPU的寄存器
  * 长度:4字节,LDR指令就是读4字节,LDRH是读2字节,LDRB是读1字节

要写内存:写内存哪个地址?从哪里得到数据?写多少字节?

* STR R0, [R1, #0x00]
  * 目的地址:R1+0x00,注意:不是写R1,是把R1的值当做内存的地址
  * 源:R0,CPU的寄存器
  * 长度:4字节,STR指令就是读4字节,STRH是读2字节,STRB是读1字节

入栈:CPU的寄存器的值,写到内存上

* PUSH {R3, LR}

  * 源:CPU的寄存器R3、LR的值
  * 目的:内存,内存哪里?使用CPU的SP寄存器指定内存地址
  * 长度:大括号里所有寄存器的数据长度,每个寄存器4字节
  * 注意:低编号的寄存器,保存在内存的低地址处

出栈:把内存中的数值,写到CPU的寄存器

* POP {R3, PC}
  * 源:内存,内存哪里?使用CPU的SP寄存器指定内存地址
  * 目的:CPU的寄存器R3、PC的值
  * 长度:大括号里所有寄存器的数据长度,每个寄存器4字节
  * 注意:内存的低地址处的数据,写到CPU低编号的寄存器

其他知识:

* CPU内部有R0、R1、……、R15共16个寄存器
* 某些寄存器有特殊作用
  * R13,别名SP,栈寄存器,保存着栈的地址
  * R14,别名LR,返回地址,保存着函数的返回地址
  * R15,别名PC,程序计数器,也就是当期程序运行到哪了

保存现场的几种场景:

* 函数调用

* 中断处理

* 任务切换

 FreeRTOS中怎么创建任务:

* 分配了TCB结构体
* 分配了栈
* 在栈里写入了函数地址、参数

调度机制:

  * 优先级不同
  * 高优先级的任务,优先执行,可以抢占低优先级的任务
  * 高优先级的任务不停止,低优先级的任务永远无法执行
  * 同等优先级的任务,轮流执行:时间片轮转
* 状态
  * 运行态:running
  * 就绪态:ready
  * 阻塞:blocked,等待某件事(时间、事件)
  * 暂停:suspend,休息去了
* 怎么管理?
  * 怎么取出要运行的任务?
    * 找到最高优先级的运行态、就绪态任务,运行它

    * 如果大家平级,轮流执行:排队,链表前面的先运行,运行1个tick后乖乖地去链表尾部排队

调度方法:

TICK中断!

链表:

FreeRTOS里面维护了3个链表,各个链表还设置了从低到高的优先级,0-4, 同一个优先级的任务由时间片轮转切换

1.ReadyList

2.DealyList

3.suspendList

队列:

FreeRTOS里面的队列是个环形缓冲区,同时这个队列有休眠和唤醒的功能

你可能感兴趣的:(嵌入式,freertos)