傻孩子前辈:你uC/OS-II 应用熟悉吗,想向你请教,如何从uC/OS-II理论顺利过渡到能够实际
我原先一直用先后台编程,虽然uC/OS-II 理该已经比较清晰,但是发现从uC/OS-II 理论过渡到实际编程,还需要一段漫长的路。主要是如何把前后台编程中的特殊编程方法,在uC/OS-II 编程中实现。 关注这个话题, 去看看周航慈写的书,你就明白了。上面讲的很详细的 程序吗就是算法加数据,注意资源竞争的处理就可以了 说的简单,想转换思维方式,把原来前后台编程模式完美移植到 RTOS 下,非得2年左右时间。
以下是几个问题:
1、在现实生活中,有些任务的特性是混合的。
比方说,一个数据处理任务优先级很低,但是在某些特殊情况下需要在很短的时间内处理一个紧急情况,这时数据处理任务该如何设计?
或者一个优先级很高的通信任务遇到一个出错状况,需要人工干预才能消除这个错误状态,由于是人工干预,解决这个错误状况的时间不定,那么这个通信任务该怎样设计才不会造成对其它正常通信信息处理的迟误?
2、假定操作系统不支持时间片轮转法,如果两个数据处理任务设定为同一个优先级,将会出现什么情况?这种状况如何解决?
3、有几种方法可以使优先级低的任务在执行某一段代码时不被优先级高的任务打断?
4、请列出实际的嵌入式系统中用到的所有的消息队列的使用方式(一对一、一对多、多对一和多对多),并列出每种消息队列的使用方式各有什么注意事项?
5、除了全局变量以外,还有什么样的情况需要原子操作保护?
6、两个任务之间的同步比较简单,如何实现多个任务之间的同步。
7.两个任务之间实现信号量资源同步时,哪个任务首先发送信号量呢? ucos不支持时间片轮转法,感觉让编程复杂了
优先级非得不一样,郁闷。
很多时候需要并行处理,大家优先级差不多的。 对于一个习惯了前后台和while(1)超级循环的人,你可以把ucos的每一个task
都看作一个核……现在不是流行多核么…… 回复【6楼】Gorgon Meducer 傻孩子
对于一个习惯了前后台和while(1)超级循环的人,你可以把ucos的每一个task
都看作一个核……现在不是流行多核么……
-----------------------------------------------------------------------
我现在遇到一个问题,想把前后台这样在段代码移植到uC/OS-II中。
在前后台中,有三个函数,分别实现“输出指令”的计算。
(1)、函数1
用于控制器正常调节时,通过PID控制,计算阀门的输出指令
(2)、函数2
当出现异常情况时(检测到某一个开关量信号),立即紧急关闭阀门,即:强制输出指令等于0
同时,必须要强制“输出指令=0”连续维持3秒,才能确保管道中的蒸汽压力不会继续升高。
(3)、函数3
处理报警和报警回差
当(管道中的蒸汽压力 > 报警值),立即紧急关闭阀门,即:强制输出指令等于0
同时,只要(管道中的蒸汽压力 > 报警值),就一直关闭阀门(强制输出指令等于0)
当检测到(管道中的蒸汽压力 < 回差值),就恢复正常调节。
我想把上述前后台三个函数,写到一个任务中,但是好象感觉有点困难,请问如何实现? 回复【2楼】lhj200304
去看看周航慈写的书,你就明白了。上面讲的很详细的
-----------------------------------------------------------------------
这本书不错,我刚买了第二版的。 mark to 【7楼】 ba_wang_mao
感觉需要2~3个任务……
这个系统明显安全性是最根本的,因此我们需要启动一个任务专门负责阀门的开关控制;
这个任务检测系统的状态,保持最基本的安全控制;我们不妨叫做Service_Task
看样子上面至少要有一个PID控制的的Task,我们不妨叫做PID_Task;
假设我们还需要一个系统信息采样的Task(是否真的需要一个Task或者干脆还用前台处理,
完全看系统要求和具体情况了),一般情况下,为了保证实时性,我们会选择建立一个Task专门
用于数据采样和基本的加工;我们不妨把这个Task叫做Sample_Task;
显然,Sample_Task是一个生产者,PID_Task是一个消费者;PID_Task以某种方式获取Sample_Task
生产的信息,产生输出,这个输出就是一个控制请求,发送到Service_Task;Service_Task实际上也是
Sample_Task的一个消费者,他根据Sample_Task得信息决定当前是否处于紧急状态;如果当前不是紧急
状态,则接受外界发送过来的控制请求…… 很有道理
页:
[1]