- 主题:我是沙B
搞了半天,某个数组溢出了,我是砂币
====================================================
已知:
void TIM3_IRQHandler(void) //State Process
{
static unsigned char j=0;
(*p_STA_Function)(&j);
TIM3->SR&=0xFFFE;
}
时钟3里执行一个指向某个函数的指针的函数
void fn_STA_PreStabilize(unsigned char *i)
{
(*i)++;
if ((*i)>10)
{
(*i)=0;
p_STA_Function=fn_STA_RetroStabilize;
}
}
时钟里的函数指针指向该函数,然后该函数会修改指向自己的指针,只向另一个函数
问题:
我在时钟3最后一个语句
TIM3->SR&=0xFFFE;
添加一个中断调试点,一步一步执行,程序可以跑通
然后去掉这个调试点,直接跑,立刻跑飞到hardfault handler的错误向量里面
求助。
--
修改:dismoon FROM 180.116.135.*
FROM 180.116.135.*
=。=
这不就是我在百度上能找到的所有答案吗,问题是这些答案毫无用处所以才会来问啊
现在chatgpt连个爬虫都不如了么
【 在 lvsoft 的大作中提到: 】
: 回应你的,是chatgpt...
: 当你遇到这种情况——即在调试时程序正常运行,但在不调试时程序出现故障(例如硬件故障处理程序)——这通常意味着存在一些竞态条件、初始化问题或者中断问题。
: 以下是一些建议,希望能帮到你解决问题:
: ...................
--
FROM 180.116.135.*
但是好奇怪,我把其他时钟全部停掉之后可以跑了
看来的确是中断优先级的问题,但是想不明白其他时钟为什么能影响这个啊
【 在 lvsoft 的大作中提到: 】
: 回应你的,是chatgpt...
: 当你遇到这种情况——即在调试时程序正常运行,但在不调试时程序出现故障(例如硬件故障处理程序)——这通常意味着存在一些竞态条件、初始化问题或者中断问题。
: 以下是一些建议,希望能帮到你解决问题:
: ...................
--
FROM 180.116.135.*
已经解决问题了
但是好像应该感谢chatgpt,又好像它没帮到我什么
首先说一下为什么要感谢,因为的确给我指了个方向,我把其他时钟都关闭了,解决了问题,然后把关闭掉的时钟一个一个开起来,把问题定位到了特定时钟内部的代码——这个解题思路有没有chatgpt我都会这么干,就是一部分一部分disable代码,然后一点点查,给我的帮助就是直接帮我定位到是其他时钟,所以算给我节省了一点时间。
但是——chatgpt现在给我的感觉就是一个百度百科爬虫,只不过把所有其他人的答案组织成人类语言,呈现给我,至于有没有独立解决问题。。。它就是个爬虫而已,目前仅仅可以定位成(垃圾&重复)信息过滤器
=========================================================================
然后详细说一下技术问题
的确很奇怪
请看如下代码
(p_Sample!=(&SampleCharastic[MAX_SAMPLE-1]))?(p_Sample++):(p_Sample=&SampleCharastic[0]);
和
(p_Sample<(&SampleCharastic[MAX_SAMPLE-1]))?(p_Sample++):(p_Sample=&SampleCharastic[0]);
这是问题代码,第一个是初始代码,第二个是我定位到问题之后修改的代码
所以感觉很奇怪。
我定义了一个数组SampleCharastic[],然后拿个指针指向数组的[0]位,然后逐步增大指针,当指针指向这个数组的最后一个元素的时候,把指针拨回[0]
自然,当指针不等于最后元素的地址的时候,指针增大,等于最后地址,那就归0,没错吧?
但是不知道为什么用【不等于】最后这个指针(已经定义p_Sample是char指针了)会指向一个函数地址,所以最后程序跑飞了
但是用了【小于】符号之后,就正常了
所以这到底怎么肥四?C数据类型检查不严格的锅?
【 在 lvsoft 的大作中提到: 】
: 当你在多个中断源之间遇到问题时,存在多种可能的原因。即使你认为其他时钟不应该影响当前的行为,它们仍然可能会间接影响系统的行为。以下是一些可能的原因:
: 中断嵌套:STM32支持中断嵌套。这意味着当一个中断正在执行时,如果另一个优先级更高的中断被触发,那么当前的中断会被暂停,直到优先级更高的中断执行完毕。如果你的中断优先级设置不正确,这可能导致不可预测的行为。
: 共享资源:两个或多个中断例程可能共享某些资源,例如全局变量、外设或内存。如果在中断服务例程中没有正确管理这些共享资源,可能会发生竞态条件,导致系统崩溃。
: ...................
--
FROM 180.116.135.*
一点一点看汇编,发现这个好像是STM32一个内部硬件机制问题
比如我定义了一个指针char *p_Sample;
初始指向地址0x78;
一般思维,如果我p_Sample++; 那肯定现在指向0x79了
但是,STM32的直接指向了0x7A,两个字节跳了
所以我用!=号就永远不可能正好等于地址,然后就跑飞了
【 在 lvsoft 的大作中提到: 】
: 当你在多个中断源之间遇到问题时,存在多种可能的原因。即使你认为其他时钟不应该影响当前的行为,它们仍然可能会间接影响系统的行为。以下是一些可能的原因:
: 中断嵌套:STM32支持中断嵌套。这意味着当一个中断正在执行时,如果另一个优先级更高的中断被触发,那么当前的中断会被暂停,直到优先级更高的中断执行完毕。如果你的中断优先级设置不正确,这可能导致不可预测的行为。
: 共享资源:两个或多个中断例程可能共享某些资源,例如全局变量、外设或内存。如果在中断服务例程中没有正确管理这些共享资源,可能会发生竞态条件,导致系统崩溃。
: ...................
--
FROM 180.116.135.*
=。=
暂时不要用chatgpt打击我的积极性了
被华为分布式物联网OS惊到了,感觉快要被降维打击了
正在写自家的OS(cortex0~4通用),目标是速度,速度,还TM是速度
给工业设备用,目的是及时性,稳定性,真实时
目前代码一塌糊涂中,等我写完给大家看哈
【 在 lvsoft 的大作中提到: 】
: 听起来像是一个优化问题。
: 你可以把汇编和c代码贴出来,我让gpt继续分析看看。
: gpt能力不算聪明,但它有人类全部的知识,所以有时候就是一个你不知道的细节的东西引发了这个现象。
: ...................
--
FROM 180.116.135.*
因为结构紧凑,代码不会拉很长,
个人习惯而已,你喜欢用if else 也一样,我就是对条件执行单指令喜欢这么写而已。
【 在 fbf 的大作中提到: 】
: 为啥要用条件表达式?条件表达式:前后两个表达式,一定是只执行其中一个吗?
--
FROM 180.116.135.*