一直以来,对于arm为啥要搞semihosting完全不理解,近来更是因为port过来的源代码里有一句printf搞得晕头转向:因为有printf这话,ads编译时把semihosting的代码编译进来了,导致生成的二进制烧写文件不能真正的启动起来,但仿真时又完全没有问题。经过深入的反汇编跟踪才知道原来是semihosting干的好事。直到把semihosting的代码完全去掉,系统才真的可以烧进flash里工作。
经过这次折腾,也让我理解了semihosting是为啥目的设计的(至少知道它的部分功能。)简单点说,semihosting可以让你的嵌入式程序通过swi调用主机(你的开发pc)的功能。例如printf在打开semihosting时,能在ads的console里输出调试信息。通过这个swi,很多标准的c语言库都能被调用,当然调用的是主机的功能!
为此我想到了两个很有意识的用处:
1 通过pc键盘输入信息给arm程序,既然printf能输出信息,那同理,getch和scanf也能从ads的console里得到键盘输入。实验了一下果然如此,所以当你的板卡的键盘不在时不要紧,用pc的键盘也一样可以调试你的程序。
2 让烧写flash的过程自动化。semihosting可以让你使用c的FILE功能打开你主机上的文件,读出或写入内容。于是你可以把编译后的bin文件自动读取到指定的内存段里,然后写入flash中。以往这个过程我都是通过adx里的load memory from file来实现的。这个苯办法用了3年了。
当然在你生成最终的代码中别让semihosting被编译进去,否则你的麻烦就来了,呵呵。
阅读(3184) | 评论(2) | 转发(0) |