- 2020-09-17
-
回复了主题帖:
颁奖:ADI & 世健 新基建系列第一期——工业以太网 答题赢好礼!
确认奖品还能自己选的啊
- 2020-09-15
-
加入了学习《基于 C2000 的数字车载电源控制系统》,观看 TI C2000 在电动车辆上的数字电源应用 - 常见电源拓扑介绍
-
加入了学习《基于 C2000 的数字车载电源控制系统》,观看 TI C2000 在电动车辆上的数字电源应用 - 介绍
-
加入了学习《TI Jacinto 系列产品在 ADAS 中的应用》,观看 TI Jacinto 系列产品在 ADAS 中的应用-2
-
加入了学习《TI Jacinto 系列产品在 ADAS 中的应用》,观看 TI Jacinto 系列产品在 ADAS 中的应用-1
-
加入了学习《回放 : TI mmWave 毫米波雷达在汽车车内的应用》,观看 TI 毫米波雷达传感器在车内应用的情况简介
- 2020-09-14
-
回复了主题帖:
颁奖:跟着cruelfox,打卡学习FreeRTOS的获奖者们、他们的学习分享
已更新信息,通过本次学习也算是入门了FreeRTOS,浅尝FreeRTOS,后续有时间还是要深入了解
- 2020-09-09
-
回复了主题帖:
中秋快乐!芯币兑换月饼开始啦!
225能换啥?
- 2020-09-06
-
回复了主题帖:
FreeRTOS打卡学习终点站:大作业来啦,挑战时间7天(关门时间9月6日)
http://www.z3f.5336644.com/thread-1139972-1-1.html
第二题,设计考虑,后期有时间在验证补充
-
发表了主题帖:
挑战FreeRTOS学习+stm32 实现shell 任务
这个是学习FreeRTOS最后一个任务
第二题,在FreeRTOS下实现一个shell任务, 它的主要功能是从片外存储如Flash、SD卡中读取程序二进制文件,新建任务并运行。请详细描述如何实现这个shell创建任务的细节,以及如何生成被载入的二进制程序文件。
准备工作
硬件环境
FreeRTOS内核文件
Flash或SD卡驱动程序
设计考虑
任务划分,任务一,识别串口数据,任务二,片外存储处理,任务三,新建任务
内部存储区域划分,这个主要是为了确定外部代码该放在那个内部存储区域,这个划分很关键,申博江苏骰宝(快3)网址:如果没有严格的划分,可能会导致程序跑飞
任务一,具体是识别串口数据,识别具体指令,及动作执行;在执行动作前会去识别任务是否运行
任务二,主要处理将外部存储bin数据读取到,内部存储空间
任务三,这个就是这个题目的关键,以下方案均未验证,仅个人想法
方案一,之前做过IAP,是可以实现代码的跳转,但是IAP是全部的代码跳转,这里如果使用跳转的方案,不知道会不会影响到我们任务调度器,以及任务堆栈
方案二,在新建任务时,修改PC值至我们内部存储地址
bin文件的生成
正常我们编译代码都是使用keil或者IAR,这个确实是可是生产bin文件,但是这个bin里面包含了很多硬件的初始化过程,不知道这些过程会不会影响到我们原来程序的运行,所以我考虑生成这个bin文件还是使用gcc去编译生成bin文件
- 2020-08-29
-
回复了主题帖:
【FreeRTOS打卡第六站开启】实验:串口后台打印,关门时间8月29日
在FreeRTOS环境下,要设计一个UART接收指定数量字符的函数,可以用怎样的途径?请描述你的思路,并分析优缺点,以及还可能怎么改进。
审题:UART接收指定数量字符,然后触发后续任务
方案一:中断收到UART数据,将UART数据存入消息队列,统计数量,达到数量任务通知或信号量触发后续任务
方案二:中断收到UART数据,将UART数据存入环形缓冲区,统计数量,达到数量任务通知或信号量触发后续任务
方案三:中断收到UART数据,将UART数据存入DMA,统计数量,达到数量任务通知或信号量触发后续任务
方案一,可能导致数据丢失,方案二,解决方案一的数据丢失问题,方案三,释放了CPU
- 2020-08-26
-
回复了主题帖:
【FreeRTOS打卡第五站开启】中断与任务切换,关门时间8月26日
源码中宏定义
#define portNVIC_INT_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000ed04 ) )
#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL )
#define portYIELD() vPortYield()
#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired ) portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT
#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x )
可见置位的是寄存器地址为0xe000ed04
查看寄存器表
中断控制状态寄存器
中断控制状态寄存器用于:
设置一个挂起(pending)NMI
设置或清除一个挂起 SVC
设置或清除一个挂起 SysTick
查找挂起异常
查找最高优先级挂起异常的向量号
查找激活异常的向量号
寄存器地址、访问类型和复位状态:
地址 0xE000ED04
访问类型 读/写或只读
复位状态 0x00000000
中断控制状态寄存器的位分配如图 所示。
由源码宏定义可知,该宏定义主要是挂起pendSV
PendSV 的典型使用场合是在上下文切换时(在不同任务之间切换)。
操作系统,上下文切换 实例:
场景假设:一个系统(按时间片轮转调度的系统)中有两个就绪的任务(A任务、B任务),
上下文切换被触发的场合可以是:
执行一个系统调用
系统滴答定时器(SYSTICK)中断,(轮转调度中需要)
A、B两个就绪任务,通过SysTick 异常启动上下文切换。如图7.15 所示。
上图是两个任务轮转调度的示意图。 但若在产生SysTick 异常时正在响应一个中断,则SysTick 异常会抢占其ISR。
在这种情况下,操作系统 不可以执行上下文切换,否则将使中断请求被延迟, 而且在真实系统中延迟时间还往往不可预知——任何有一丁点实时要求的系统都决不能容忍这种事。 因此,在CM3 中也是严禁没商量——如果操作系统 在某中断活跃时尝试切入线程模式,将触犯用法fault 异常。
为解决此问题,早期的操作系统 大多会在SysTick 异常中 检测当前是否有中断在活跃中,只有没有任何中断需要响应时,才执行上下文切换(切换期间无法响应中断)。
然而,这种方法的弊端在于, 它可能把任务切换动作拖延很久(因为如果抢占了IRQ,则本次SysTick 在执行后不得作上下文切换,只能等待下一次SysTick 异常),尤其是当某中断源的频率和SysTick 异常的频率比较接近时,会发生“共振”。 现在好了,PendSV 来完美解决这个问题了(产生SysTick 异常时正在响应一个中断,SysTick 异常会抢占其ISR。此时,操作系统 不可以执行上下文切换,否则将使中断请求被延迟):
把PendSV 编程为最低优先级的异常,PendSV 异常会自动延迟上下文切换的请求,直到其它的ISR 都完成了处理后才放行。 如果操作系统 检测到某IRQ 正在活动并且被SysTick 抢占,它将悬起一个PendSV 异常,以便缓期执行上下文切换。如图7.17 所示
流水账记录如下:
1. 任务 A 呼叫SVC 来请求任务切换(例如,等待某些工作完成)
2. OS 接收到请求,做好上下文切换的准备,并且pend 一个PendSV 异常。
3. 当 CPU 退出SVC 后,它立即进入PendSV,从而执行上下文切换。
4. 当 PendSV 执行完毕后,将返回到任务B,同时进入线程模式。
5. 发生了一个中断,并且中断服务程序开始执行
6. 在 ISR 执行过程中,发生SysTick 异常,并且抢占了该ISR。
7. OS 执行必要的操作,然后pend 起PendSV 异常以作好上下文切换的准备。
8. 当 SysTick 退出后,回到先前被抢占的ISR 中,ISR 继续执行
9. ISR 执行完毕并退出后,PendSV 服务例程开始执行,并且在里面执行上下文切换
10. 当 PendSV 执行完毕后,回到任务A,同时系统再次进入线程模式。
部分资料来源:网络
- 2020-08-25
-
回复了主题帖:
【FreeRTOS打卡第五站开启】中断与任务切换,关门时间8月26日
ddllxxrr 发表于 2020-8-24 19:53 portYIELD_FROM_ISR(pdTRUE),让调度器切换任务。对于 Cortex-m3 平台,portYIELD_FROM_ISR() 除了检 ...
这个就是复制粘贴啊,标准答案?
- 2020-08-23
-
回复了主题帖:
【FreeRTOS打卡第四站开启】任务间通信,关门时间8月23日
本次学习主要针对的是任务间通讯
正常来说想计算器这样的程序一般裸奔是很好解决了,但是为了更好的了解本章的内容做了以下修改
原本的裸奔扩展为几个任务
任务一,扫描键盘,识别键盘输入,将数据传输至运算任务,与显示任务,优先级最高(由于该程序是计算器,使用到的按键会比较多,而且并无其他实时任务占用资源,所以这里使用扫描键盘的做法,节省硬件资源)
任务二,运算任务,存储任务一传输过来的数据,进行存储或运算,具体更具传输指令触发动作
任务三,显示任务,显示其他任务传输过来的数据,及指令触发动作
根据本章学习到的内容定义了三个方案
方案一:任务通知
个人理解,每个任务都有相应的任务通知,应该是可以触发某个任务的任务通知,如果以上不成立,该方案不可行,
任务一,实时在扫描,识别到触发信号,通知到任务二,与任务三,执行相应动作
任务二,等待任务通知,并执行相应动作,运算结果发送至任务三
任务三,等待任务通知,并执行相应动作
方案二:队列
任务一,实时在扫描,识别到触发信号发送队列数据到任务二
任务二,做相应触发动作,并发送队列数据到任务三
任务三,根据指令执行相应动作
方案三:信号量
前提定义全局变量
任务一,实时在扫描,识别到触发信号,发送与任务二的信号量
任务二,识别信号量,获取相应数据,并发送与任务三的信号量
任务三,识别信号量,获取相应数据,并触发相应动作
- 2020-08-19
-
回复了主题帖:
【FreeRTOS打卡第三站开启】任务状态及切换,关门时间8月20日
思考题: 在FreeRTOS任务程序中,常使用 xTaskDelay() 函数来达到延时执行的目的。若在某一个任务里调用了 xTaskDelay(20), 想等待20个时间单位,结果这一回延时操作却超过了25个时间单位。请分析有可能是哪些原因造成的?
答:首先这个xTaskDelay(20),20个时间单位肯定是硬吃的,毋庸置疑,主要是要分析后面这个多出来的5个时间单位被谁吃了。
1、被更高优先级抢占,就是当前任务到等到19个时间单位时,有一个高优先级任务抢占资源,运行了6个时间单位才释放资源
2、被同优先级抢占,当前任务到等到19个时间单位时,有一个同优先级任务正好在就绪态,肯定时可以接手资源运行6个时间单位再释放资源
3、被中断吃了,不管是裸奔还是,上rtos硬件中断始终优先级是最高的,正常编程过程中,我们是不会再中断中做了很多东西,但不排除有些人在中断中写了应用代码,甚至写了延时函数
- 2020-08-17
-
回复了主题帖:
【FreeRTOS打卡第二站开启】堆栈—任务切换的关键,关门时间8月17日
个人觉得这章应该是RTOS的核心
正常裸奔基本不考虑堆栈问题,只有调用中断的时候会调用到栈的功能,正常使用比较多的也是定义变量,动态内存使用的也比较少
当使用了RTOS就无时不刻的在调用堆栈,TCB基本就是动态获取堆,任务切换就要一直压栈出栈,同时还要考虑到系统中断的堆栈调用
这里RTOS针对各任务的整个堆栈操作,就要是由任务调度器来完成,整个过程大概就是
保存任务1现场,恢复任务2现场,保存任务2现场,恢复任务1现场不断的切换
什么是现场呢,就是CPU运行状态寄存器
51与contex-m核其实比较大的区别就是现场的不同,51的资源相较于contex-m的资源要少,cpu调用的寄存器也少,可以理解为现场小,所以在保存现场的数据上,contex-m是会比51要大一些的
以上为个人理解,如果理解有误,请大家指正,其实看这章也是挺懵的,查了很多资料,希望大家相互交流共同进步
- 2020-08-13
-
回复了主题帖:
FreeRTOS打卡第一站开启:应用场景站,关门时间8月14日
应用:数据网关(数据集中器)
功能:故名思意,主要功能就是汇总终端设备数据,统一上报之后台,根据终端设备的类型不同,数据网关将调用的硬件资源也是不一样的
例如:2路串口,1路无线,1路iic采集数据,1路spi数据存储,同时还要处理后端发送的指令,及定时上传数据至后台
在没有rtos情况下,可按流程进行数据处理,但是数据采集过程中肯定会出现通信超时等情况导致资源分配不均,以及无法及时处理后台数据等问题
引入rtos架构
1、能合理分配等待的空闲时间的资源
2、代码简单化,在硬件资源独立的情况下只需要考虑当前任务的处理逻辑
3、机动性更高了,当需要添加一路数据采集是,直接添加一个任务,并不影响其他任务运行
具体任务划分
任务1,串口1数据采集,由于串口资源属于硬件资源,为了减少硬件资源在不同任务间调用可能会出问题,所以独立开一个任务
任务2,串口2数据采集,
任务3,无线数据采集
任务4,iic数据采集
任务5,数据汇总及数据存储
任务6,后台通讯处理
- 2020-08-10
-
加入了学习《电子电路基础知识讲座》,观看 3.3.1 共射放大电路一般性质
-
加入了学习《电子电路基础知识讲座》,观看 3.5.3 乙类功率放大电路
- 2020-08-08
-
加入了学习《电子电路基础知识讲座》,观看 1.2.2 电感