目录
2.2_sys_command_string函数如何影响程序运行
1 问题描述
1)不进行keil仿真时,程序不能正常运行;
2)使用keil仿真时,程序会在_sys_command_string函数卡一下,点击继续执行后,程序就可以正常运行。
注:笔者使用编译环境为Arm compiler V6编译器、GD32F5芯片、未使用microlib、优化等级-O0。
2 问题分析
2.1如何定位到_sys_command_string函数
keil仿真调试里面,可以设置调试程序的起始点,默认是从main()开始调试的。如下图,使用正常程序进行keil仿真,程序已经执行到main()函数。
笔者对异常程序进行仿真时,仍设置main()函数为调试的起始点。但打开仿真调试后,程序并没有执行到main()函数,而是执行到_sys_command_string函数。如下图。
仿真调试时,卡在_sys_command_string函数后,可以强制程序往下执行;不适用keil仿真时,程序就会卡死在这里。
2.2_sys_command_string函数如何影响程序运行
查询手册可知,_sys_command_string为库中处理main()的输入参数的函数,其作用为:设置传递给main()的参数个数argc、参数列表argv。
查询手册可知,_sys_command_string函数依赖于半主机模式,调用该函数,导致进入半主机模式,导致程序异常。
(ps:keil仿真时不就可以使用半主机模式吗?为什么进入调试后会卡在_sys_command_string?请大佬评论区指教。)
2.3_sys_command_string函数如何产生的
查询手册可知,使用Arm Compoler6,且优化选项为-O0时,会链接一个默认的库。这个库会对main()的输入参数进行处理,并且支持半主机模式。
_sys_command_string就是库中处理main()的输入参数的函数之一。
3 解决办法
如2.2节中所描述,_sys_command_string函数导致进入半主机模式,导致程序异常。_sys_command_string为库函数,解决思路为更换库,或者优化库。
3.1方案一:使用Microlib
Mocrolib不支持半主机模式,程序不会进入半主机模式引起异常。
3.2方案二:提高编译优化等级,不使用-O0优化等级
查询手册如下图,使用除-O0以外的优化等级时,如果main()没有输入参数,那么会链接一个优化过的库,该库不会对main()的输入参数进行处理。即不会调用_sys_command_string函数,不会进入半主机模式。
3.3方案三:手动声明main()函数无输入参数
在.c文件中加入图中代码,编译器自动选择优化过的库,效果同3.2。
当编译优化等级必须为-O0时,可以使用该方案。