powerpc,mpc8313平台e300核,模运算出现溢出?
本帖最后由 bitliu1983 于 2010-06-29 18:18 编辑各位达人:
本人在mpc8313开发板上写程序,系统引导起来后,特意设置成:没有mmu,不使用cache,不开中断,不开异常初始化,相当于裸板程序。
因为我们的操作系统,发现了一个bug,在系统里,进行模运算,发现模运算一段时间后,出现溢出。
程序如下:
unsigned long msr=0;
unsigned long b=0;
unsigned long i,j,k=0;
unsigned char s;
unsigned long xer=0x0;
unsigned long hid2=0x0;
unsigned long moshu=0x0;
powerpc_disable_int(); //关中断
unlock_ram_in_cache();
disable_dcache();//禁止掉数据cache,此时指令cache没有开,所以相当于指令cache没有作用。
while(1)
{
for(i=0;i<100;i++)
{
for(j=0;j<100;j++)
{
s +=0;
}
}
k++;
__asm__ __volatile__ ("mfmsr %0":"=r" (msr):);
__asm__ __volatile__ ("sync");
__asm__ __volatile__ ("isync");
//get_tbus();//获取时间的一个随机函数
b = get_tbus%100+ 27;
if((b>127)||(b<27))
{
printf("shit stop\n");
printf("error %x,%x\n",b,k);
while(1)
{
}
}
}
最后居然运行3小时后,会进入到进入到if分支里,出现了溢出,b的值打印是一个很大的值班,不在27-127范围内??
所以想请教下大家,是编译器问题吗(gcc),还是我的powerpc平台的初始化和系统的链接脚本之类的有问题? unsigned当signed解释了? unsigned当signed,但运行2小时后才出现?
还有一个问题,就是当我代码换成如下方式时:
k=get_tbus();//获取时间的一个随机函数
b =k%100+ 27;
就没有溢出了。
对比两段c代码的汇编,没有发现其它问题。 代码有错误unsigned long b; 其范围
当然有问题啦 运行3个小时肯定溢出啦!
改为unsigned char b;即可了
页:
[1]