问题前因:
因shell测试命令太多,代码占用空间太大了,准备删除一些不常用的测试指令,便于裁剪空间
正常现象以及Map文件
日志:
map:
异常现象
日志:
从错误信息看是输入了无效的字符,查看ascii 码表发现字符范围[0, 127], 应该是字符值大于127导致的;
map:
排查问题
1. 屏蔽代码
经过大量排查后发现每当屏蔽了sscanf()函数后就出现异常,但是sscanf()函数别的地方也没有用到,用法也没有问题;从map看只是多了2k的flash占用
2. 调试代码
从最后一个异常位置调试发现 *string
一直是0xff,从而死循环没有退出;
3. 定位问题
根据上面发现的异常,返回上一级查看传入的参数
然后根据地址查看Map文件
发现是因为地址对齐规则,这里自动填充了,并且填充的是0xff; 从而导致从这里调用时不能正常退出字符串解析
4. 解决办法
-
在linkscript中_shell_command_start之前加上对齐:如下
. = ALIGN(4); _shell_command_start = .; KEEP (*(shellCommand)) _shell_command_end = .; . = ALIGN(4);
此时
_shell_command_start
之后不再是fill
了,固问题解决