我正在为使用相对复杂的通信接口的ARM Cortex-M3编写一个引导加载程序;这与实际应用程序使用的相同。应用程序使用Keil的RTX作为内核,通信堆栈依赖于此。当然是利用GCC。
引导加载程序执行以下基本步骤:
这是相当简化的,但它充分地描述了场景的目的。
令人惊讶的是,最后一个问题被证明是很难启动应用程序。其想法是禁用中断、设置向量表、堆栈指针,并跳转到新的向量表中的应用程序的重置向量。所有这些工作都很有趣,只是在不久之后,我就犯了个大错。
通过实验,如果我在一个普通的引导加载程序(不使用RTX或者当然不使用通信堆栈)中这样做,那么对应用程序的引导就会很好。因此,RTX似乎是问题所在。
问题是,真正的引导加载程序在进入升级模式之前不需要RTX。因此,显而易见的方法是,在确定需要RTX之前不要启动RTX;但是,它似乎被黑客入侵到启动代码中,所以当我进入引导加载程序代码时,已经太晚了;实际上,引导加载器main()函数已经是一个线程了!
最好的方法似乎是没有启动RTX (可惜我没有使用FreeRTOS!)直到我需要它;然而,这似乎需要一些黑客。另一种方法是以某种方式禁用所有中断和异常,但由于某种原因,我在那里也没有成功。有人有这两种方法的例子吗?
发布于 2016-07-30 16:07:00
如果有人遇到这种情况,解决方案实际上很简单。我只是在SystemInit文件中定制了system_efm32gg.c ()函数!虽然_efm32gg是厂商特有的,但system_X.c似乎是一种广泛使用的ARM结构--至少我在ST、NXP和EnergyMicro/SiliconLab中见过--所以这是一种很好的通用方法。
我早该弄清楚了!叹息
https://stackoverflow.com/questions/38649093
复制相似问题