CosyOS
发表于 2023-12-31 10:41:05
本帖最后由 CosyOS 于 2023-12-31 10:47 编辑
JackLan 发表于 2023-12-30 18:47
使用 的版本在keil c51中进行仿真调试。
发现无法加载用户任务,一直卡在su_exit_critical函数中, 也没有 ...
1、测试程序中使用了UART1,用于printf,在线仿真时可能会引起冲突。
2、离线仿真时,PendSV中断(当前为INT0)被触发后无法进入,导致无法任务调度。在线仿真时能否进入,待我今天测试一下。
建议仿真做为辅助手段,不要过分依赖,还是以实测为准。
13918210822
发表于 2024-1-1 22:57:39
CosyOS 发表于 2023-11-14 13:48
CosyOS-II 已升级至 V1.1.3,除API用户参考手册外,其它说明文档基本更新完毕。
CosyOS-II V1.1.3 新增 ...
从代码命名看:有任务Task, 有各种同步用内核对象(互斥,信号量等等),有内核缓冲(FIFO, msgQ, mail...)
但是,应该没有所谓的进程(没有MMU, 不会有独立进程空间),
也没有独立于Task的线程,或者说Task就是Thread, Task也没有Fork之类的继承关系。
所以, 本质上, 这个RTOS是类似MultiTask为中心的多任务调度平台,并且允许以“中断服务
”为高优先级驱动为实时响应保障。
如非必要,勿增实体,对于一个单用户32位平台(没有MMU,没有多RING), 这样的简捷也是很让人愉快的。
如果,我只要3种最简单的任务同步手段,1,2,3; 分别应该是什么?
以上是一个CosyOSII新人的小白问题。
CosyOS
发表于 2024-1-2 03:29:23
本帖最后由 CosyOS 于 2024-1-2 04:17 编辑
13918210822 发表于 2024-1-1 22:57
从代码命名看:有任务Task, 有各种同步用内核对象(互斥,信号量等等),有内核缓冲(FIFO, msgQ, mail... ...
CosyOS - 线程同步工具
首先解释一下,下面将要用到的词汇:
“并发”:是指存在瞬时的生产速度大于消费速度的情况。
1、事件的发生速度有时会比较快,导致处理事件的线程来不急处理;
2、发送消息的速度有时会比较快,导致接收消息的线程来不急接收。
“一次”:是指不会出现“并发”。
一、事件同步
(一)、处理一个事件
1、一次同步
信 号:即标志位,用户自己实现,无相关服务支持。
二值信号量:有相关服务支持,任务中获取时有超时机制。
恢复和挂起:最为高效,推荐使用。
2、并发同步:计数信号量。
(二)、处理一类(组)事件:事件标志组。
二、信息同步
1、一次同步
飞 信:极简类型、极速通信(最为高效,推荐使用)
私 信:随意定义、灵活多变
消息邮箱:任意类型、数据拷贝
2、并发同步
消息队列:并发发送、指针引用
重要补充
1、有的事件或信息,发生一次就得处理一次,如果有遗漏将导致错误的结果。对于这种情况,如果存在并发,就必须采用并发同步工具;
2、有的事件或信息,即使累计发生了多次未处理(并发),仍然仅处理一次即可。对于这种情况,虽存在并发,仍可采用一次同步工具。
具体是哪种情况,就需要用户具体情况具体分析了。
总之,用户需根据具体情况选择最为合适的同步工具,无法一句话概括。
CosyOS
发表于 2024-1-2 12:39:17
本帖最后由 CosyOS 于 2024-1-2 12:45 编辑
以上为CosyOS - 线程同步工具
success
发表于 2024-1-2 19:29:23
请问一下,CosyOS-II 所有说明文档,有没有PDF带目录的?
13918210822
发表于 2024-1-4 17:47:03
本帖最后由 13918210822 于 2024-1-4 17:49 编辑
CosyOS 发表于 2024-1-2 03:29
CosyOS - 线程同步工具
首先解释一下,下面将要用到的词汇:
感谢Cosy老师详细的解答, 因为接下来我首先在STC32F平台上实际开发一个项目(交换机管理接口)。因此,理解问题目前对于我来说以80251平台为目标。
还有几个问题想请老师解答,首先是关于临界区的问题
1.关于任务临界区问题, 什么时候应该调用任务临界区。
如果在中断中获取数据写入FIFO1, 特定唯一任务中读取FIFO1. 这个时候,是否可以不用临界区保护?
这个访问进入uEnterCritical 和 退出临界区 uExitCritical的时间是否是固定或者可以预期的
void su_enter_critical(void)
{
#if MCUCFG_ISA == __ARM__
if(!s_taskcri_counter)
#endif
mSysIRQ_Disable;
s_taskcri_counter++;
}
void su_exit_critical(void)
{
s_taskcri_counter--;
if(!s_taskcri_counter){
if(s_sign_scheduling){
mPendSV_Set;
mSysIRQ_Enable;
while(s_sign_scheduling);
}
else{
mSysIRQ_Enable;
}
}
}
其中,退出临界区,设置PendSV标记,检查是否需要进行任务切换, 其中似乎很有深意
可否讲解一二。特别是这个PendSV在251平台上,是否所有用户任务切换都由其触发?
os_xxx.h/c代码互相联系紧密,因此,有些偷懒,想请作者直接解释一下其中思路, 谢谢
CosyOS
发表于 2024-1-4 22:54:48
13918210822 发表于 2024-1-4 17:47
感谢Cosy老师详细的解答, 因为接下来我首先在STC32F平台上实际开发一个项目(交换机管理接口)。因此,理 ...
从应用的角度来说,还是要先看一下《API 用户参考手册》。
1、只要是通过调用API来实现的功能,用户都不用考虑临界区的问题,即使需要进入任务临界区,也是系统自动进入和退出,用户无需多虑。
2、有些特定的功能,CosyOS未提供API,在任务中访问时,需要用户自己进入任务临界区来实现,对于这种情况,《API 用户参考手册》中都有相关说明。如任务中访问全局变量、任务中访问事件标志组等。
需要注意的是,上述两种情况,无论是系统自动进入任务临界区,还是用户自己进入任务临界区,当相应功能支持全局访问时,实现的就是全局的互斥访问,而不仅仅是任务级的互斥访问。
3、任务临界区还可用于对用户自己的、特定的代码段的保护,而这个保护不仅仅是任务级的,如果处理得当,也可以是全局的。
关于这个问题,其实是有关“互斥访问”的问题,等这几日做一个专题再详细讲解一下。
CosyOS
发表于 2024-1-4 23:02:52
13918210822 发表于 2024-1-4 17:47
感谢Cosy老师详细的解答, 因为接下来我首先在STC32F平台上实际开发一个项目(交换机管理接口)。因此,理 ...
1、任务中调用的许多系统服务,都将自动进入任务临界区执行。
2、无论哪种内核的MCU,对于CosyOS来说,“任务调度/切换”仅发生在PendSV中。
3、消息队列的相关服务,用户不用考虑临界区问题。
CosyOS
发表于 2024-1-4 23:25:31
本帖最后由 CosyOS 于 2024-1-4 23:26 编辑
13918210822 发表于 2024-1-4 17:47
感谢Cosy老师详细的解答, 因为接下来我首先在STC32F平台上实际开发一个项目(交换机管理接口)。因此,理 ...
void su_enter_critical(void)
{
#if MCUCFG_ISA == __ARM__
if(!s_taskcri_counter) // ARM内核时,只有在首次进入任务临界区时才关闭系统中断,原因是ARM内核关闭系统中断需多条汇编指令,判断后再关闭可提速。
#endif
mSysIRQ_Disable; // 而51/251,关闭系统中断仅需两条汇编指令,故每次进入任务临界区时都直接关闭即可,条件判断反而会浪费时间。
s_taskcri_counter++;
}
void su_exit_critical(void)
{
s_taskcri_counter--;
if(!s_taskcri_counter){ // 如果是最后一次退出任务临界区
if(s_sign_scheduling){ // 如果需要任务调度
mPendSV_Set; // 触发PendSV(置中断标志位)
mSysIRQ_Enable; // 开启系统中断
while(s_sign_scheduling); // 等待进入PendSV中断调度任务。如不等待,在极端情况下会继续顺序执行多条指令,可能会出错。
}
else{
mSysIRQ_Enable; // 不需要任务调度时,仅开启系统中断即可。
}
}
}
CosyOS
发表于 2024-1-5 13:19:34
补充说明一下临界区问题
1、对于CosyOS已经提供服务支持的功能,用户直接调用API实现即可,无需考虑临界区问题。
2、只有在任务中访问“事件标志组”和“非原子全局变量”时才需要用户自己进入“任务临界区”实现,具体请查阅《API用户参考手册》。
3、临界区用于对特定代码段、全局/任务级公共资源或程序过程的保护。
先简单补充这些,过几天我会出一个详细说明。