UCOSII 使用笔记

本文概述了UCOS抢占式系统的特性,如任务优先级管理和中断处理。重点讲解了如何通过空闲任务计数器测量CPU利用率,并介绍了Cortex-M0的寄存器结构及其在UCOS中的应用,特别是中断嵌套和中断唤醒机制。此外,还涉及了消息队列和事件管理在任务间同步中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

UCOS使用总结

1.UCOS 是抢占式系统,换句话来说,优先级高的能够被准时执行,优先级低的很容易被高优先级抢占,导致执行任务延迟。

2.UCOS一般为64个优先级,有些可以到256,其实一般开发就几个任务,任务多了更不好把控。很多时候都尽量少的开辟新的任务,因为这样可以避免开辟更多的栈,

3.目前而言使用的QP,只用到了消息队列,其它信号量和事件都没有使用,无论是消息队列和信号量和事件都是任务之间通讯使用的,也就是书上说的同步,同步说法个人认为搞的太过抽象。不方面初学者理解。

4.任务调度,在循环中为OSSched,在中断中是退出中断后调用红OSIntExit,在这个函数中判断中断嵌套是不是执行完,执行完就执行一次调度,OSTimeTick 是针对OSTimeDly,在这个函数中对应任务的一个计数器减。

5.UCOS 默认开启空闲任务,这个任务一般不适用,我一般用来喂看门狗。

UCOS CPU利用率显示

UCOS中开辟一个状态任务,其实就是定时去 看空闲计数器执行了多少次。

一个大任务启动,然后调用OSStatInit,这个函数其实就是执行一个任务延时,然后读取这个时间段 空闲任务计数器的个数。

以此来作为后续 计算CPU利用率的分母,后面执行程序,就按照这个定时读取空闲计数器个数,因为一旦有任务执行,空闲任务势必会被抢占,也就是得不到执行。

cortex m0 使用理解

一般m0 有R0 到 R15

R0-R7为低位寄存器,R8-R12为高位寄存器。

R13为堆栈寄存器。

R14为LR寄存器

R15为PC寄存器

XPSR  中很重要的低位数据,表示中断执行的函数号。这个东西意思,单片机执行中断,在那个中断服务函数中,尤其是中断嵌套中,就可以清晰的看到在那个中断执行中。这个寄存器高为是状态寄存器,表示当前执行计算的一些状态,类似51中的PSW,

PRIMASK,这个寄存器的最低位就是全局中断的开关,在OS中一般是保持这个寄存器,然后最后恢复这个寄存器。

无论在函数前面是否开启全局中断,都是在恢复PRIMASK的值,这样就不用粗暴的开关中断,因为你不知道函数是不是在前面就关闭了全局中断,然后您执行一次临界台操作又把全局中断开启了。

arm V6 m只有四个优先级,默认栈使用的MSP,无论是主程序还是中断都使用的MSP,在主循环显示的thread模式,中断中是handle模式,我犯了过一次错误就是在中断中执行了低功耗操作,但是我不知道,为什么呢,因为我用的老的ucos 任务切换的过程没有调用pendsv操作,都是手动直接切换,这个导致很多时候函数都是在handle模式中。

在中断中执行低功耗操作,要想唤醒,要让配置的唤醒中断源大于当前中断。否则唤不醒

中断执行硬件自动压栈顺序

消息队列

创建消息队列,在UCOS中使用事件管理,Event.

OSQPend

OSQPost()

Post过后 置位事件所属任务的优先级。然后设置调度,因为这个函数是在中断中执行,软中断需要等待中断完执行才能被执行。

 

 

 

 

 

### 整理 STM32UCOSII 学习资料的方法 #### 一、建立结构化的笔记框架 为了有效地整理有关 STM32 及其与 UCOSII 结合使用的知识点,建议构建一个清晰有序的笔记体系。可以按照以下分类来组织: - **基础概念** - 关于微控制器的基础介绍以及何为实时操作系统(RTOS),特别是针对UCOSII的特点[^1]。 - **环境搭建** - 描述开发工具链的选择(如Keil MDK)、硬件平台准备(比如选用哪个型号的STM32芯片),还有如何安装配置必要的软件包。 - **移植过程** - 记录将UCOS-II 移植到特定版本的 STM32 上的具体步骤,包括但不限于调整时钟设置、中断向量表重定位等内容[^3]。 - **API 使用指南** - 总结常用 API 的功能及其参数解释;例如 `OSInit` 初始化系统,`OSTaskCreate` 创建新任务等函数的应用场景和注意事项[^2]。 - **案例分析** - 收集并解析实际工程项目实例,展示不同应用场景下的编程技巧和技术难点解决方案。 - **常见错误排查手册** - 列举可能遇到的问题及对应的解决办法,帮助快速诊断调试过程中碰到的各种异常情况。 #### 二、编写详尽的学习日志 对于每一次实践操作都应保持良好的记录习惯,这不仅有助于加深理解记忆,也为后续复习提供了宝贵的参考资料。每篇日记至少应该包含以下几个部分: - 当前进度概述:简要描述当天所学的主要内容或完成的工作; - 新发现的知识点/技能点:重点标注那些之前未曾接触过的理论知识或是新的编码方法; - 实验数据&测试结果:如果有做实验的话,则需附带完整的输入输出样本截图或者图表形式的结果呈现; - 遇见挑战及应对措施:诚实地面对困难,并分享解决问题的心得体会; - 下一步计划安排:规划未来几天内的学习目标或者是待验证的想法假设。 ```python def write_learning_log(date, overview, new_knowledge, experiment_result=None, challenges=None, next_plan=None): log_entry = f""" Date: {date} Overview of Today's Progress: {overview} New Knowledge/Skills Acquired: {new_knowledge} Experiment Data & Test Results (if any): {"Presented as screenshots or charts." if not experiment_result else experiment_result} Challenges Faced and Solutions Found (optional): {"No significant issues encountered today." if not challenges else challenges} Next Steps Planned: {"To be determined based on the current progress." if not next_plan else next_plan} """ with open('learning_logs.txt', 'a') as file: file.write(log_entry) write_learning_log( "2023-10-08", "Learned about initializing uCOS-II using OSInit(). Created two LED blinking tasks.", "`OSInit()` initializes the system before creating tasks via `OSTaskCreate()`. Tasks are added between initialization and starting multitasking through `OSStart()`.[^4]", None, "Had trouble understanding task priorities at first but found resources explaining it clearly.", "Tomorrow will focus more deeply on inter-task communication mechanisms." ) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值