导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→[转帖]获得ET_LOAD_STORE,内存访问异常。[liufengzhong]

 *第48050篇: [转帖]获得ET_LOAD_STORE,内存访问异常。

  
楼 主:liufengzhong 2014年8月31日10:45
 [转帖]获得ET_LOAD_STORE,内存访问异常。
我是新手,我尝试在startkit中运行T递归阶乘的代码,一段时间后,我得到 "Program received signal ET_LOAD_STORE, Memory access exception.".
我认为是单片机似乎只支持64位和无法保持对于阶乘50号,但我不知道。
这是我的代码。

int factorial(int n)
{
if(n!=1)
return n*factorial(n-1);
return 1;
}
int main()
{
uint64_t i;
int value[37]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,25,50,70,100,450,1000,3249,10000,25206,100000,205023,1000000,1723508,2000000,10000000,14842907};
for (i=1; i  <=value[i]; i++)
{
printf("Factorial of %d is %lu\n",value[i],factorial(value[i]));
}
return 0;
}

回答:


回复:

我怀疑的加载/存储异常的原因是一个堆栈溢出。由于阶乘()是递归的,将使用的内存至少一个字(4字节)每次调用它自身的时间。对于较大的n堆栈溢出的可用内存量,并开始覆盖方案,在这一点什么事情都可能发生(包括加载/存储除外)。用阶乘的非递推版本应该解决这个问题:

int factorial(int n)
{
 int result = 1;
 while (n >   1) {
   result *= n;
   --n;
 }
 return result;
}


如果你解决了堆栈溢出,你会得到一个数组边界异常(ET_ECALL)。这是因为下面的for循环的退出条件将永远不会被满足:

for (i=1; i  <=value[i]; i++) {
 ...
}

因此我将继续递增,直到它等于值阵列(37)此时表达式的值的大小[37]将出界和运行时将引发异常。可以通过将其更改为改变循环的退出条件,例如固定的:

for (i=1; i  <37; i++) {
 ...
}

一旦你做了这个改变你的程序应该运行到完成,但对n的值很大,你仍然不会得到正确的结果。阶乘函数接受一个int参数的上xCORE为32位宽。如果n!不适合在一个32位的值,则阶乘函数内部的乘法会溢出。这不会导致异常,但阶乘()的结果将不匹配因子的数学值,由于这种溢出。


>>>>>>对该主题发表你的看法

本主题贴数1,分页: [第1页]


[上一篇主题]:[转帖]引脚三态的PWM电路的初始高阻抗问题

[下一篇主题]:[转帖]Flash编程问题