Yang.Lian 发表于 2024-6-6 16:56:26

本帖最后由 Yang.Lian 于 2024-6-6 17:23 编辑

CosyOS 发表于 2024-6-6 16:47
那 你 PENDSV_FIFO 深度 设置大一些,
测试一段时间,观察它的最大值
可能不是 PENDSV_FIFO 的问题
我原以为 PSVFIFO 显示的是当前值深度,
后来看了一下代码,发现是当前使用的最大深度

真的是很奇怪,我如果不开 Debugger/Taskmgr 很容易卡死,最近一次尝试 331 次卡死了

如果开启 Debugger/Taskmgr ,仅仅只开启,其他一行代码都不动,重新编译,哪怕是发个 exit\r\n 关闭输出,依然都坚挺到 2000+ 以后

有没有可能是 PendSV 中断导致的?
我现在用的 P7

// <o> 中断向量号
// <i> 中断向量号
#define MCUCFG_PENDSVIRQ P7INT_VECTOR

// <o> 中断开启
// <i> 此项您应在文本编辑界面中定义。
// <i> 示例:EX0 = 1
#define mPendSV_Enable (P7INTE |= 0x01)

// <o> 中断关闭
// <i> 此项您应在文本编辑界面中定义。
// <i> 示例:EX0 = 0
#define mPendSV_Disable (P7INTE = 0x00)

// <o> 中断触发(置中断标志位)
// <i> 此项您应在文本编辑界面中定义。
// <i> 示例:IE0 = 1
#define mPendSV_Set (P70 = 0)


// <o> 中断清零(清中断标志位)
// <i> 此项您应在文本编辑界面中定义。
// <i> 即使该标志位能够在中断服务程序中硬件自动清零,仍建议用户不要省略,以确保其可靠清零。
// <i> 示例:IE0 = 0
#define mPendSV_Clear\
        do               \
        {                  \
                P70 = 1;       \
                P7INTF = 0x00; \
        } while (false)

CosyOS 发表于 2024-6-6 17:31:29

本帖最后由 CosyOS 于 2024-6-6 17:32 编辑

Yang.Lian 发表于 2024-6-6 16:56
可能不是 PENDSV_FIFO 的问题
我原以为 PSVFIFO 显示的是当前值深度,
后来看了一下代码,发现是当前使用 ...
你各有几个 定时中断 和 查询?包括任务和钩子
系统空闲中,关掉低功耗

Yang.Lian 发表于 2024-6-6 17:42:13

CosyOS 发表于 2024-6-6 17:31
你各有几个 定时中断 和 查询?包括任务和钩子
系统空闲中,关掉低功耗
...

还有一个现象:


我还有一个中断,在中断中会 iReusmeTask 一个 Task,我会在中断中点灯,然后在 Task 中关灯,
正常情况下,如果外部触发一下,这个灯会快速的闪烁,直到停止触发
但是,如果MODBUS卡死以后(卡死以后多久?这里时间就比较随意了,可能是卡死5秒钟,也可能是卡死1个小时后)此时触发一下,灯会亮,但是不会灭了



1个中断查询 syscfg.h
2个定时查询 syscfg.h
系统空闲已经关了

CosyOS 发表于 2024-6-6 17:48:29

本帖最后由 CosyOS 于 2024-6-6 17:51 编辑

Yang.Lian 发表于 2024-6-6 17:42
还有一个现象:



你先关掉任务管理器,再创建一个定时中断任务,内容随便写,比如只有一个空操作,看能否正常?
注意 syscfg.h 中 用户定时中断总数 用户定时查询总数 要调整。

Yang.Lian 发表于 2024-6-6 18:17:28

CosyOS 发表于 2024-6-6 17:48
你先关掉任务管理器,再创建一个定时中断任务,内容随便写,比如只有一个空操作,看能否正常?
注意 syscf ...
明天再战

今天PendSV中断改了一下,我担心用只用P70会偶尔漏触发,而且我用的是下降沿触发,但是在STC文档中普通IO暂时不要用上下沿触发
所以,我改了一下,
1. 使用P70改为用P7
2. 下降沿触发改为高电平触发

今晚不关机,明天看结果

如果不行,就按楼主的方法试一下

CosyOS 发表于 2024-6-6 18:19:49

Yang.Lian 发表于 2024-6-6 18:17
明天再战

今天PendSV中断改了一下,我担心用只用P70会偶尔漏触发,而且我用的是下降沿触发,但是在STC文 ...

好的。
如果还不行,我们再找原因。

CosyOS 发表于 2024-6-6 18:30:43

本帖最后由 CosyOS 于 2024-6-6 18:32 编辑

Yang.Lian 发表于 2024-6-6 18:17
明天再战

今天PendSV中断改了一下,我担心用只用P70会偶尔漏触发,而且我用的是下降沿触发,但是在STC文 ...
历来的测试结论:
1、如果全局只有一个 定时查询,会出问题的;
2、如果全局只有一个 定时中断,不会出问题。

开启任务管理器后,会有两个系统级的 定时查询、一个系统级的 定时中断。

如果用户只创建了一个 定时查询,又未开启任务管理器,就要出问题了。

你这个情况,看来 很有可能和 PendSV中断 的选择 有关,不是 定时中断/查询 的原因。



380091044 发表于 2024-6-7 08:20:18

黄乃贝 发表于 2024-6-4 13:24
直接在该网页下载的例程,怎么编译后提示   ERROR:   FILE DOES NOT EXIST 工程里面是包含 os_var.h文件的 ...

跟我昨天出现的错误一模一样,很奇怪,跟文件名字有关,文件名不能太长,我的改短就好了。

Yang.Lian 发表于 2024-6-7 09:25:41

CosyOS 发表于 2024-6-6 18:30
历来的测试结论:
1、如果全局只有一个 定时查询,会出问题的;
2、如果全局只有一个 定时中断,不会出问 ...

稳定运行54639次了

所以,
根本原因我猜想就是 PendSV 的中断,突然有一次没有成功,导致内核的调度错误,进而死锁了

官方文档也没有说为什么普通IO不要使用上下沿中断,保险起见用高电平触发,
现在要担心的问题是,
PendSV有可能重复触发,会不会影响 CosyOS 内核?有没有副作用
不过从测试的结果来看没有发现异常。

又一个宝贵的经验啊,至少在 STC32G12K 要这样
1. 将 P7 配置成高电平触发或者低电平触发
2. 使用整个P7作为中断源

附代码供参考
初始化代码

        {
                /* PendSV_Handler */
                P7_MODE_IO_PU(GPIO_Pin_All);
                /* P7 中断优先级为0级 */
                PIN_IPH &= ~0x80;
                PIN_IP &= ~0x80; /* PIN_IPL */
                /* 初始化设置为低电平 */
                P7 = 0x00;
                /* P07 高电平中断*/
                P7IM0 = 0xff;
                P7IM1 = 0xff;
        }




///////////////////////////////////////////////////////////////////////////////
// <h> PendSV_Handler设置
// <i> 您可选择一个未使用的硬件中断,做为PendSV_Handler,用于执行系统的挂起服务。
// <i> 还需在初始化钩子中配置该中断,确保它不会被硬件触发,中断优先级必须为最低级。


// <o> 中断向量号
// <i> 中断向量号
#define MCUCFG_PENDSVIRQ P7INT_VECTOR

// <o> 中断开启
// <i> 此项您应在文本编辑界面中定义。
// <i> 示例:EX0 = 1
#define mPendSV_Enable (P7INTE = 0xff)

// <o> 中断关闭
// <i> 此项您应在文本编辑界面中定义。
// <i> 示例:EX0 = 0
#define mPendSV_Disable (P7INTE = 0x00)

// <o> 中断触发(置中断标志位)
// <i> 此项您应在文本编辑界面中定义。
// <i> 示例:IE0 = 1
#define mPendSV_Set (P7 = 0xff)

// <o> 中断清零(清中断标志位)
// <i> 此项您应在文本编辑界面中定义。
// <i> 即使该标志位能够在中断服务程序中硬件自动清零,仍建议用户不要省略,以确保其可靠清零。
// <i> 示例:IE0 = 0
#define mPendSV_Clear\
        do               \
        {                  \
                P7 = 0x00;   \
                P7INTF = 0x00; \
        } while (false);





Yang.Lian 发表于 2024-6-7 09:48:23

小结一下,最近使用 CosyOS 的心得
1. CosyOS 的代码质量非常高,还特别快;另外我的代码质量也还行,哈哈
2. CosyOS 的时钟确实可以随便设置,没有发现什么副作用,11059200 都不是问题,时间还是很准的
3. CosyOS 会自动帮你进入低功耗模式,我建议作者改一下,
    这个事情开发者必须知道,不然DMA中断莫名其妙不中断就不好了
4. CosyOS 再次催作者的 FAQ

页: 62 63 64 65 66 67 68 69 70 71 [72] 73 74 75 76 77 78 79 80 81
查看完整版本: 全局不关总中断的 RTOS,CosyOS-III-V1.2.0, 送 擎天柱-AI8051U转89C52核心板