最近正在做以太网协议和UCOS的整合工作,发现一个问题,导致发生了硬件错误,即进行死循环,最后的问题已经解决,我抽象描述如下:
OSSemPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)
在调用OSSemPend,我传递err参数的时候使用了两种方法:
INT8U *err
OSSemPend (..., err);
其中函数执行一切正常,但是return的时候发生了错误;
原因:IAR使用了R4寄存器进行传递参数err,R4的值为0x2A,err的value也是0x2A,因此err在函数中改变了地址0x2A所指向的值,由于这个地址不能被这样访问,因此错误;
INT8U err;
OSSemPend(..., &err);系统运行正常,没有任何错误;
IAR没有使用寄存器传递参数,而是使用了RAM,内存传递一切正常
我使用第一种方法应该是没有问题的,而IAR却错误处理了,这个有什么原因吗? |