-
在FreeRTOS环境下,要设计一个UART接收指定数量字符的函数,可以用怎样的途径?请描述你的思路,并分析优缺点,以及还可能怎么改进。
审题:UART接收指定数量字符,然后触发后续任务
中断收到UART数据,将UART数据存入数据接收数组,统计数量,达到一帧数据数量后,将接收到的数据复制到备份数组中,通知或信号量触发数据处理任务。
数据处理任务只对备份数组中的数据进行处理。
数据接收数组仅被串口中断调用用于接收数据。
没用备份数组占用空间较大,但程序不易丢帧。各任务间耦合较小,利于程序分层。
-
abc9981 发表于 2020-8-26 21:39
源码中宏定义
#define portNVIC_INT_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000ed04 ) )
#defi ...
-
portYIELD_FROM_ISR()在任务中请求上下文切换。用于在中断任务执行完后,进行一次任务切换。
-
计算任务调用xTaskNotifyWait()等待键盘任务取得按键键码,键盘任务取得键码后通过xTaskNotify()将键码通过uINotifiedVaule发给计算任务。
计算任务通过队列与显示任务交换数据。显示任务调用xTaskNotifyWait()等待计算任务发送显示数据,计算任务将要显示的数据写入队列后,通过xTaskNotify()通知显示任务显示。
计算任务取出键盘任务发送的键码后,将键码压栈,并将该键码写入队列,通知显示任务显示。
当计算任务接收到键盘任务发送的等号或回车键后,将压栈的数据进行出栈运算。并将等号和运算结果写入队列通知显示任务显示,
-
因为执行xTaskDelay会触发任务调度
如果是抢占式:可能被高优先级任务抢占了;
如果是时间片轮转,可能延时时间超过了这个任务所占用的剩余时间片时间,被同级任务轮转了;
也可能触发任务调度,被其他调度给其他任务了(也有可能是低优先级任务)
还可能中断等事件占用了5个单位时间
-
如果task1和task2都调用了同一个函数fun(),为保证task1执行fun()期间,被切换到task2,为保证在task2中执行fun(),时对task1的fun()不产生影响,需要将fun()定义为重入/再入函数,即fun()reentrant
-
51的程序切换时,程序指针pc,程序状态字psw,通用寄存器组(acc,b,r0-r7,dptr),对arm cortex而言是r0-r16,xpsr
如果任务间有对共同外设的寄存器操作,可能还得保存相关外设寄存器,这个得自己在任务中手动添加了
另外,在中断过程中,51是pc和psw自动压栈,cortex是xpsr和r0-r16自动压栈。
任务切换就是把任务中用到的各种寄存器压栈,用到的局部变量单独保存,不要冲突,不要被覆盖。
好一点的编译器会查出潜在的覆盖,把局部变量定义成static,也可让编译器查出是否覆盖。
-
智能车的数据融合,适合用实时操作系统来完成。
智能车需要接收激光雷达,姿态传感,跌落探测等位置状态数据。并根据这些数据进行数据融合,判断出智能车当前的位置,姿态以及现场环境。
这些传感器的通讯速率各不相同,如果不用操作系统的话处理起来较为繁琐,需要考虑各传感器的不同的处理要求进行处理,其实全用中断来处理,效率也不会很高。而用操作系统就程序编起来就非常简单,只针对各传感器进行通讯程序编写就好。每个传感器接收好数据后,通过信标或邮箱将数据发送给数据融合处理函数即可。
-
个人信息正确
谢谢论坛和泰克活动!
祝论坛越办越好!泰克能推出更多简单易用,物美价廉的产品!
-
很好很强大
-
大补大补,谢谢楼主
-
大补,大补,谢谢楼主
-
好东西,还有PCB,lib,难得
-
谢谢楼主
-
原版啊,谢谢楼主
-
谢谢楼主,无私奉献
-
程序烧在ram中,没写入flash
-
谢谢楼主,学习了
-
谢谢楼主,学习了
-
正在学这个东西 我
也来看看