先说结论:文件路径太长导致的
事情是这样的,在用STM32的开发板调试CC1101的收发工程,运行程序呢,结果电脑死机重启了,顺便吐槽一下,最近用VMware经常重启。
电脑重启后再打开工程,发现程序能烧录进去开发板,但是却无法运行,LED灯不亮,程序中有亮灯的代码,说明没有运行程序,再用Keil调试发现根本进不了main函数,(已经在魔术棒中设置run to main() ),于是问同事,说是可能跟bootloader有关系,但是后来烧了一个原子的跑马灯例程,可以正常运行,所以bootloader不是原因所在,后来想到启动文件这个问题。打开工程一看
启动文件带个叹号,双击显示访问被拒绝:
查看文件权限,并不是只读
那么问题是什么呢,Remove这个启动文件,重新添加进来,还是带感叹号,在同事的建议下,浏览到另一个工程的启动文件,添加进来,发现可行了,感叹号不见了。
难道是文件不一样,用NotePad++对比,没什么区别。右键看属性,也发现不了异样,所以基本可以排除是文件不一样的问题,除非是有些不可见的属性导致的区别。
然后下午一直倒腾,发现本工程原本的启动文件加上其他工程的启动文件共三个,放置在不同文件夹,结果也会不一样,在同一个文件夹内,三个启动文件表现都是一样的。
具体表现为:
添加在某个目录下的启动文件OK
往下就不行了:
更往下更不行,以为是这个文件夹的属性有区别,右键查看,也是一样的。
以为是这个std_lib文件夹不应该放启动文件,但是看另一个工程,放在这个文件夹是OK的,其实原本这个例程就是把启动文件放在这个文件夹。
再问同事,说可能跟工程配置文件有关,但是打开下列文件对比:
确实有一些设置不一样,但这些似乎也和启动文件并不相关。
然后实在没办法,网上一搜发现下列文章:
keil5.24复制文件后再次编译出现was denined,或者cannot open source input file_keil access to was denied-CSDN博客
其中有条评论写着:
于是收到启发,好像确实是路径过长的问题,因为Source_file文件夹可行,其下面的Std_lib却不行,新建文件夹New Std_lib,把启动文件放里面也不行:
以为是级数的问题,为了验证这个猜想,所以在另一个OK的工程里往深了建文件夹放置启动文件,然后添加到工程里,但是建了好几级还是可以。
再想到不跟文件夹级数相关,但可能跟整个路径的字符长度相关,为了验证,建了这么个文件夹:
添加到工程中后,果真,终于出现感叹号了!!!
所以证明是路径长度的问题,再回想双击时的提示:
显示的路径是不完整的,估计是超过了Keil程序文件的路径限制。
有了这么个判断,就好办了,以后文件夹不要放那么深的目录了,名字也不要起得过长。
长了鼠标点起来也累啊。真的无语啊,这么个错误。弄了一下午。无论如何找到了根源,不白费功夫。