找回密码
 立即注册
楼主: CosyOS

全局不关总中断的 RTOS,CosyOS-III-V1.2.0, 送 擎天柱-AI8051U转89C52核心板

 火... [复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:433
  • 最近打卡:2025-05-02 20:23:18

5

主题

1127

回帖

4267

积分

荣誉版主

积分
4267
发表于 2023-12-31 10:41:05 | 显示全部楼层
本帖最后由 CosyOS 于 2023-12-31 10:47 编辑
Jack*** 发表于 2023-12-30 18:47
使用 的版本在keil c51中进行仿真调试。
发现无法加载用户任务,一直卡在su_exit_critical函数中, 也没有 ...

1、测试程序中使用了UART1,用于printf,在线仿真时可能会引起冲突。
2、离线仿真时,PendSV中断(当前为INT0)被触发后无法进入,导致无法任务调度。在线仿真时能
进入,待我今天测试一下。
建议仿真做为辅助手段,不要过分依赖,还是以实测为准。

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-03-10 16:08:45

6

主题

131

回帖

666

积分

高级会员

积分
666
发表于 2024-1-1 22:57:39 | 显示全部楼层
Cos*** 发表于 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 - 线程同步工具 首先解释一下,下面将要用到的词汇: “并发”:是指存在瞬时的生产速度大于消费速度的情况。 1、事件的发生速度有时会比较快,导致处理事件的线程来不急处理; 2、发送消息的速度有时会比较  详情 回复 发表于 2024-1-2 03:29
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:433
  • 最近打卡:2025-05-02 20:23:18

5

主题

1127

回帖

4267

积分

荣誉版主

积分
4267
发表于 2024-1-2 03:29:23 | 显示全部楼层
本帖最后由 CosyOS 于 2024-1-2 04:17 编辑
139182*** 发表于 2024-1-1 22:57
从代码命名看:有任务Task, 有各种同步用内核对象(互斥,信号量等等),有内核缓冲(FIFO, msgQ, mail... ...

CosyOS - 线程同步工具

首先解释一下,下面将要用到的词汇:
“并发”:是指存在瞬时的生产速度大于消费速度的情况。
1、事件的发生速度有时会比较快,导致处理事件的线程来不急处理;
2、发送消息的速度有时会比较快,导致接收消息的线程来不急接收。
“一次”:是指不会出现“并发”。

一、事件同步

(一)、处理一个事件

1、一次同步
信          号:即标志位,用户自己实现,无相关服务支持。
二值信号量:有相关服务支持,任务中获取时有超时机制。
恢复和挂起最为高效,推荐使用。

2、并发同步计数信号量

(二)、处理一类(组)事件事件标志组



二、信息同步

1、一次同步
飞       信:极简类型、极速通信(最为高效,推荐使用)
私       信:随意定义、灵活多变
消息邮箱:任意类型、数据拷贝

2、并发同步
消息队列:并发发送、指针引用



重要补充
1、有的事件或信息,发生一次就得处理一次,如果有遗漏将导致错误的结果。对于这种情况,如果存在并发,就必须采用并发同步工具;
2、有的事件或信息,即使累计发生了多次未处理(并发),仍然仅处理一次即可。对于这种情况,虽存在并发,仍可采用一次同步工具。
具体是哪种情况,就需要用户具体情况具体分析了。



总之,用户需根据具体情况选择最为合适的同步工具,无法一句话概括。



回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:433
  • 最近打卡:2025-05-02 20:23:18

5

主题

1127

回帖

4267

积分

荣誉版主

积分
4267
发表于 2024-1-2 12:39:17 | 显示全部楼层
本帖最后由 CosyOS 于 2024-1-2 12:45 编辑

以上为  CosyOS - 线程同步工具
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2024-02-12 09:21:26

3

主题

21

回帖

149

积分

注册会员

积分
149
发表于 2024-1-2 19:29:23 | 显示全部楼层
请问一下,CosyOS-II 所有说明文档,有没有PDF带目录的?

点评

现在没有哦。。。  发表于 2024-1-2 20:47
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-03-10 16:08:45

6

主题

131

回帖

666

积分

高级会员

积分
666
发表于 2024-1-4 17:47:03 | 显示全部楼层
本帖最后由 13918210822 于 2024-1-4 17:49 编辑
Cos*** 发表于 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代码互相联系紧密,因此,有些偷懒,想请作者直接解释一下其中思路, 谢谢


点评

void su_enter_critical(void) { #if MCUCFG_ISA == __ARM__ if(!s_taskcri_counter) // ARM内核时,只有在首次进入任务临界区时才关闭系统中断,原因是ARM内核关闭系统中断需多条汇编指令,判断后  详情 回复 发表于 2024-1-4 23:25
1、任务中调用的许多系统服务,都将自动进入任务临界区执行。 2、无论哪种内核的MCU,对于CosyOS来说,“任务调度/切换”仅发生在PendSV中。 3、消息队列的相关服务,用户不用考虑临界区问题。  详情 回复 发表于 2024-1-4 23:02
从应用的角度来说,还是要先看一下《API 用户参考手册》。 1、只要是通过调用API来实现的功能,用户都不用考虑临界区的问题,即使需要进入任务临界区,也是系统自动进入和退出,用户无需多虑。 2、有些特定的功能,C  详情 回复 发表于 2024-1-4 22:54
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:433
  • 最近打卡:2025-05-02 20:23:18

5

主题

1127

回帖

4267

积分

荣誉版主

积分
4267
发表于 2024-1-4 22:54:48 | 显示全部楼层
139182*** 发表于 2024-1-4 17:47
感谢Cosy老师详细的解答, 因为接下来我首先在STC32F平台上实际开发一个项目(交换机管理接口)。因此,理 ...

从应用的角度来说,还是要先看一下《API 用户参考手册》。
1、只要是通过调用API来实现的功能,用户都不用考虑临界区的问题,即使需要进入任务临界区,也是系统自动进入和退出,用户无需多虑。
2、有些特定的功能,CosyOS未提供API,在任务中访问时,需要用户自己进入任务临界区来实现,对于这种情况,《API 用户参考手册》中都有相关说明。如任务中访问全局变量、任务中访问事件标志组等。
需要注意的是,上述两种情况,无论是系统自动进入任务临界区,还是用户自己进入任务临界区,当相应功能支持全局访问时,实现的就是全局的互斥访问,而不仅仅是任务级的互斥访问。
3、任务临界区还可用于对用户自己的、特定的代码段的保护,而这个保护不仅仅是任务级的,如果处理得当,也可以是全局的。

关于这个问题,其实是有关“互斥访问”的问题,等这几日做一个专题再详细讲解一下。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:433
  • 最近打卡:2025-05-02 20:23:18

5

主题

1127

回帖

4267

积分

荣誉版主

积分
4267
发表于 2024-1-4 23:02:52 | 显示全部楼层
139182*** 发表于 2024-1-4 17:47
感谢Cosy老师详细的解答, 因为接下来我首先在STC32F平台上实际开发一个项目(交换机管理接口)。因此,理 ...

1、任务中调用的许多系统服务,都将自动进入任务临界区执行。
2、无论哪种内核的MCU,对于CosyOS来说,“任务调度/切换”仅发生在PendSV中。
3、消息队列的相关服务,用户不用考虑临界区问题。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:433
  • 最近打卡:2025-05-02 20:23:18

5

主题

1127

回帖

4267

积分

荣誉版主

积分
4267
发表于 2024-1-4 23:25:31 | 显示全部楼层
本帖最后由 CosyOS 于 2024-1-4 23:26 编辑
139182*** 发表于 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; // 不需要任务调度时,仅开启系统中断即可。
                }
        }
}



回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:433
  • 最近打卡:2025-05-02 20:23:18

5

主题

1127

回帖

4267

积分

荣誉版主

积分
4267
发表于 2024-1-5 13:19:34 | 显示全部楼层
补充说明一下临界区问题

1、对于CosyOS已经提供服务支持的功能,用户直接调用API实现即可,无需考虑临界区问题。
2、只有在任务中访问“事件标志组”“非原子全局变量”时才需要用户自己进入“任务临界区”实现,具体请查阅《API用户参考手册》。
3、临界区用于对特定代码段、全局/任务级公共资源或程序过程的保护。



先简单补充这些,过几天我会出一个详细说明。



回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 21:02 , Processed in 0.207755 second(s), 113 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表