嵌入式学习路线和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里面的队列是个环形缓冲区,同时这个队列有休眠和唤醒的功能

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ROTS(Robotic Operating System)是一个开源的、分布式的、可扩展的机器人开发平台。在ROTS中,多线程开发具有重要的作用。 举个例子,假设我们正在开发一个机器人应用程序,需要同时执行多个任务,比如控制机器人的行动、处理传感器数据、与其他设备进行通信等。为了提高程序的性能和效率,我们可以使用ROTS的多线程开发来实现这些任务的并行执行。具体步骤如下: 首先,我们需要定义多个线程,并将每个线程与相应的任务联系起来。例如,一个线程负责控制机器人的行动,另一个线程负责处理传感器数据,其他线程负责通信等。 然后,我们需要使用ROTS提供的多线程库来创建和管理这些线程。ROTS提供的多线程库包含了一些常用的函数和类,用于创建、启动、停止和管理线程。通过这些函数和类,我们可以方便地控制和监控每个线程的状态。 接下来,我们需要在每个线程中实现相应的任务逻辑。例如,在控制机器人的线程中,我们可以编写代码来控制机器人的运动方向和速度;在处理传感器数据的线程中,我们可以编写代码来接收和处理传感器数据;在通信线程中,我们可以编写代码来与其他设备进行通信。 最后,我们需要在主线程中启动和管理这些线程。主线程负责创建和启动其他线程,并负责监控和管理这些线程的状态。通过ROTS提供的多线程库,我们可以方便地控制和管理每个线程的执行过程。 总结来说,ROTS的多线程开发可以让我们方便地实现机器人应用程序中的并行任务执行,并提高程序的性能和效率。通过合理地设计和组织多个线程,我们可以同时执行多个任务,实现机器人的复杂功能。同时,ROTS提供的多线程库也提供了一些方便的函数和类,用于创建、启动、停止和管理线程,使开发过程更加简单和高效。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值