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