赞
踩
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里面的队列是个环形缓冲区,同时这个队列有休眠和唤醒的功能
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。