- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我已经为位于扇区 0 的 SAM4S 编写了一个引导加载程序,并在扇区 1 加载了一个应用程序。然而问题是,当我尝试跳转到新函数时,它似乎生成了一个异常(调试器转到 Dummy_Handler ()).
引导加载程序在映射中包含以下条目:
.application 0x00410000 0x0
0x00410000 . = ALIGN (0x4)
0x00410000 _sappl = .
0x00410004 _sjump = (. + 0x4)
应用图像映射文件有:
.vectors 0x00410000 0xd0 src/ASF/sam/utils/cmsis/sam4s/source/templates/gcc/startup_sam4s.o
0x00410000 exception_table
…
.text.Reset_Handler
0x0041569c 0x100 src/ASF/sam/utils/cmsis/sam4s/source/templates/gcc/startup_sam4s.o
0x0041569c Reset_Handler
异常表定义如下:
const DeviceVectors exception_table = {
/* Configure Initial Stack Pointer, using linker-generated symbols */
.pvStack = (void*) (&_estack),
.pfnReset_Handler = (void*) Reset_Handler,
引导加载程序将应用程序跳转点声明为:
extern void (*_sjump) ();
然后进行以下调用:
_sjump();
0x00410004 处的内存内容是 0x0041569d,我注意到这不是字对齐的。这是因为我们使用的是 Thumb 指令吗?无论哪种方式,为什么它不是 0x0041569c?或者更重要的是,为什么这会成为异常(exception)?
谢谢,
德文
更新:找到this但它似乎对我不起作用:
void (*user_code_entry)(void);
unsigned *p;
p = (uint32_t)&_sappl + 4;
user_code_entry = (void (*)(void))(*p - 1);
if(applGood && tempGood) {
SCB->VTOR = &_sappl;
PrintHex(p);
PrintHex(*p);
PrintHex(user_code_entry);
user_code_entry();
}
代码打印:004100040041569D0041569C
更新更新:尝试使用 C 函数指针跳转的代码产生了以下反汇编:
--- D:\Zebra\PSPT_SAM4S\PSPT_SAM4S\SAM4S_PSPT\BOOTLOADER\Debug/.././BOOTLOADER.c
user_code_entry();
004005BA ldr r3, [r7, #4]
004005BC blx r3
我能够使用以下程序集进行此操作:
"mov r1, r0 \n"
"ldr r0, [r1, #4] \n"
"ldr sp, [r1] \n"
"blx r0"
基于此,我想知道是否需要堆栈重置,如果需要,是否有可能在 C 中完成?
最佳答案
我在使用 SAM4E 时遇到了同样的问题。我无法猜测您的问题可能是什么,但我可以指出我遇到的困难和我使用的信息。
我的引导加载程序没有将部分固件存储在正确的内存位置。这导致了 dummy_handler 异常。当我修复地址计算中的错误时,引导加载程序完美运行。
我的建议:
其他可能有帮助的想法:
您必须指向的地址是 0x00410000 而不是 0x00410004。 Atmel 的示例代码(参见函数 binary_exec
)结合 Intel Hex 格式(记录类型 05)应该可以解决这个问题。
希望这条信息对您有所帮助!
关于c - 从 bootloader 跳转产生异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18218380/
我想知道引导加载程序在哪些硬件上运行?它是在 RAM 上运行,还是在主板的处理器上运行,如果它不在处理器上运行,那么在加载操作系统时处理器的用途是什么,例如将操作系统的内核加载到处理器中(如果它是'就
我将编写并测试一个引导加载程序。为了做到这一点,我计划将引导加载程序复制到软盘镜像文件并将其安装在 VM 中。 但是,我不确定将引导加载程序的机器代码放在哪里。它是否只是转储到文件的前几个字节中? 最
我需要在 grub2 命令提示符下挂载 VHD 文件。 我尝试使用“loopback”命令,如下所示: grub > insmod ntfs grub > insmod ntldr grub > lo
引导加载程序与引导加载程序有何不同。根据我的说法,引导加载程序存储在 ROM 中,引导加载程序存储在硬盘的 MBR 中(如果我错了,请纠正我)。 bootstrap loader是启动后第一个执行的程
我有以下 U-Boot 环境变量: nas220> printenv autoload=no autostart=no baudrate=115200 bootargs=console=ttyS0,1
我正在考虑开发一个简单的(开始)UEFI 引导加载程序来加载 ELF 镜像,并且想知道是否有人可以很好地进入任何现有项目,或者我可以用来开始的示例和。 此外,我想知道是否有人有任何让 virtual
我目前正在修复我为加载自定义实模式 x86 内核 (SYS.BIN) 而编写的引导加载程序。我设法让它读取根目录和 FAT,并从文件系统加载一个小型内核,所有这些都在引导扇区内。但是,我开始用更大的内
终于, Spark 板边缘板今天到了;-) 遵循这个写得很好的指南:https://codelabs.developers.google.com/codelabs/sparkfun-tensorflo
STM32 App Note 2606 对此进行了讨论,但没有简单的代码示例。 最佳答案 此答案已使用 IAR EWARM 在 STM32F072 Nucleo 板上进行测试。该答案仅使用“STM32
我已经为位于扇区 0 的 SAM4S 编写了一个引导加载程序,并在扇区 1 加载了一个应用程序。然而问题是,当我尝试跳转到新函数时,它似乎生成了一个异常(调试器转到 Dummy_Handler ())
这个主要是在facebook的源码中看到的 Bootloader.setResourceMap({"bMxb7":{"name":.... javascript中的bootloader到底是什么?有什
我终于了解了汇编和裸机编程的基础知识。或者至少这是我的想法。这是我写的(我自己第一次:)) [BITS 16] [ORG 0X7C00] Yaz: MOV SI, Msa MOV AL, [SI
我查了很多关于这个问题的资料,但还没有找到明确的答案。如您所知,AVR 微 Controller Atmega128有一个Flash存储器,可分为引导加载程序和应用程序存储器。我已经调整了每一项的参数
我发现我的 android 图像存在问题,命令 adb reboot bootloader 只是重新启动 android,而不是进入引导加载程序模式。 为了解决这个问题,我做了一些研究,发现实际上有两
我尝试创建一个打印“hello world”的简单引导加载程序。 当我调用一个只打印“hello world”的函数时我可以做到这一点,但是当我调用一个函数来打印特定字符串时,什么也没有发生。 为此,
我在通过 Java Webstart 运行 Java RCP 应用程序时遇到问题。 这适用于团队中的其他人,但不适用于我。 (你不就是喜欢这类问题吗) 我认为问题在于它正在下载 32 位版本的应用程序
已结束。此问题不符合 Stack Overflow guidelines .它目前不接受答案。 我们不允许提出有关书籍、工具、软件库等方面的建议的问题。您可以编辑问题,以便用事实和引用来回答它。 关闭
我找到了这个网站:http://www.os-forum.com/minix/boot/ 声称记录了Minix的启动顺序。 但是在我从Git获得的Minix 3.2的源代码树中,上述站点中描述的文件根
引导加载程序无论如何都会在该地址加载它?为什么要在程序中指定这个? 最佳答案 ORG 伪指令的作用是告诉汇编器将此偏移量添加到提到的所有绝对地址。例如,如果您编写“MOV AX,my_string”并
我是这些设备的新手,即使它们很便宜,我也不想不必要地把它们弄成砖头。 我使用 esptool 将 NodeMCU 固件刷写到我的模块上。这样做时,我需要指定写入文件的地址,通常是 0x00000。这是
我是一名优秀的程序员,十分优秀!