ARM程序中,如果不用延时,就没法运行,但又不是硬件延时的奇怪问题。

comdoc 2010-01-05 04:08:35
问题出在在现有的LCD汉字显示驱动的基础上继续开发时。

有个一个搜索函数,代码如下,功能是在一个给定的地址开始,连续搜索一个汉字编码(2byte),找到编码就返回位置,函数很简单。

现在的问题是,如果去掉串口调试代码 s_UartPrint("..."); 这一行,调用这个函数就会出现数据异常(DataAbort),加上就一切正常,感觉这行代码在这里的作用应该是有一个延时作用,但不知道为什么会这样,请大侠们指教。分析一下可能的问题。

经过调试,发现如果将s_UartPrint("...")这行加在调用这个函数之前,也能正常运行,很奇怪,去掉就不行了。

int strSearch(unsigned char* StartAddr, unsigned char* str, int strNum)
{
unsigned char* pAddr = StartAddr;
int i;

//s_UartPrint("...");// 影响运行成功与否的关键一句

for (i=0; i<strNum; i++)
{
if (*pAddr == *str && *(pAddr+1) == *(str+1))
{
return i;
}
pAddr += 2;
}
return -1;
}
...全文
102 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
comdoc 2010-01-06
  • 打赏
  • 举报
回复
多谢楼上各位,发现问题了,原来是调用strSearch前,有一个有一个结构体类型的指针没有赋值导致数据异常,后面的这些现象都是表象,不是问题的实质。
comdoc 2010-01-05
  • 打赏
  • 举报
回复
查看并且验证了一下s_UartPrint()中的寄存器,都是串口相关的,仅就寄存器没有影响。
吧s_UartPrint()替换为for(i=0; i<10 i++)后,也能正常运行,感觉和延时有一定关系。

[Quote=引用 3 楼 deep_pro 的回复:]
说是延时太牵强,你换其他延时语句试试

s_UartPrint也许操作了一些寄存器,对你的程序很重要
[/Quote]
deep_pro 2010-01-05
  • 打赏
  • 举报
回复
说是延时太牵强,你换其他延时语句试试

s_UartPrint也许操作了一些寄存器,对你的程序很重要
comdoc 2010-01-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 iisbsd 的回复:]
检查一下StartAddr和str是不是都至少有strNum*2大小?
[/Quote]

都是,否则加上s_UartPrint("...")这一句就不会正常运行
iisbsd 2010-01-05
  • 打赏
  • 举报
回复
检查一下StartAddr和str是不是都至少有strNum*2大小?

23,128

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧