网上看的例子是COSMIC下的,不知道IAR怎么搞。
版主也不知道图的来路?ST官方的啊
只是官方资料给的例子是COSMIC下的,想在IAR用,不知道怎么做
下面是例子的代码,MAIN_USER_RESET_ADDR是常量0x9000ul,这样中断向量被重定位到0x9000开始的地方。
这段代码应该和编译器直接有关,所以想知道IAR怎么实现同样的功能。
/* Redirected interrupt vector table
* Copyright (c) 2008 STMicroelectronics
*/
#include "main.h"
typedef void @far (*interrupt_handler_t)(void);
struct interrupt_vector {
unsigned char interrupt_instruction;
interrupt_handler_t interrupt_handler;
};
@far @interrupt void NonHandledInterrupt (void)
{
/* in order to detect unexpected events during development,
it is recommended to set a breakpoint on the following instruction
*/
return;
}
extern void _stext(); /* startup routine */
struct interrupt_vector const UserISR_IRQ[32] @ MAIN_USER_RESET_ADDR;
//redirected interrupt table
struct interrupt_vector const _vectab[] = {
{0x82, (interrupt_handler_t)_stext}, /* reset */
{0x82, (interrupt_handler_t)(UserISR_IRQ+ 1)}, /* trap */
{0x82, (interrupt_handler_t)(UserISR_IRQ+ 2)}, /* irq0 */
{0x82, (interrupt_handler_t)(UserISR_IRQ+ 3)}, /* irq1 */
{0x82, (interrupt_handler_t)(UserISR_IRQ+ 4)}, /* irq2 */
{0x82, (interrupt_handler_t)(UserISR_IRQ+ 5)}, /* irq3 */
{0x82, (interrupt_handler_t)(UserISR_IRQ+ 6)}, /* irq4 */
{0x82, (interrupt_handler_t)(UserISR_IRQ+ 7)}, /* irq5 */
{0x82, (interrupt_handler_t)(UserISR_IRQ+ 8)}, /* irq6 */
{0x82, (interrupt_handler_t)(UserISR_IRQ+ 9)}, /* irq7 */
{0x82, (interrupt_handler_t)(UserISR_IRQ+10)}, /* irq8 */
{0x82, (interrupt_handler_t)(UserISR_IRQ+11)}, /* irq9 */
{0x82, (interrupt_handler_t)(UserISR_IRQ+12)}, /* irq10 */
{0x82, (interrupt_handler_t)(UserISR_IRQ+13)}, /* irq11 */
{0x82, (interrupt_handler_t)(UserISR_IRQ+14)}, /* irq12 */
{0x82, (interrupt_handler_t)(UserISR_IRQ+15)}, /* irq13 */
{0x82, (interrupt_handler_t)(UserISR_IRQ+16)}, /* irq14 */
{0x82, (interrupt_handler_t)(UserISR_IRQ+17)}, /* irq15 */
{0x82, (interrupt_handler_t)(UserISR_IRQ+18)}, /* irq16 */
{0x82, (interrupt_handler_t)(UserISR_IRQ+19)}, /* irq17 */
{0x82, (interrupt_handler_t)(UserISR_IRQ+20)}, /* irq18 */
{0x82, (interrupt_handler_t)(UserISR_IRQ+21)}, /* irq19 */
{0x82, (interrupt_handler_t)(UserISR_IRQ+22)}, /* irq20 */
{0x82, (interrupt_handler_t)(UserISR_IRQ+23)}, /* irq21 */
{0x82, (interrupt_handler_t)(UserISR_IRQ+24)}, /* irq22 */
{0x82, (interrupt_handler_t)(UserISR_IRQ+25)}, /* irq23 */
{0x82, (interrupt_handler_t)(UserISR_IRQ+26)}, /* irq24 */
{0x82, (interrupt_handler_t)(UserISR_IRQ+27)}, /* irq25 */
{0x82, (interrupt_handler_t)(UserISR_IRQ+28)}, /* irq26 */
{0x82, (interrupt_handler_t)(UserISR_IRQ+29)}, /* irq27 */
{0x82, (interrupt_handler_t)(UserISR_IRQ+30)}, /* irq28 */
{0x82, (interrupt_handler_t)(UserISR_IRQ+31)}, /* irq29 */
};
今天用了一个笨办法来测试自编bootloader。
先在IAR下创建2个工程bootldr和main。
bootldr程序执行完所需bootloader代码后,跳转至0x9000,工程按默认方式编译,ROM开始地址0x8000。
main是主应用程序,编译时设定ROM开始地址为0x9000。
然后就是笨办法来了,手工修改bootldr的hex文件中0x8004-0x807F的中断向量表,比如0x8004处跳转至0x9004,全部修改完成后将bootldr和main两个hex文件一起烧入芯片,运行一下看看结果,很正常,哈哈,自编的bootloader成功啦
版主也不知道图的来路?ST官方的啊
只是官方资料给的例子是COSMIC下的,想在IAR用,不知道怎么做
dadodo 发表于 2010-7-31 18:30
官方的?那份文档?
是这个文档:AN2659 STM8 in-application programming (IAP) using a customized user-bootloader
对了版主主
:04 0000 05 0000B191B5
这个是IARSTM8 输出的HEX文件最后部分,请问 05 这里指什么意思呢? 查了HEX格式资料说是“开始线性地址” 不知道在这里是什么意思?
这个也算不是中断向量重新映射,是模拟方案而已!呵呵!上面的问题哪位知道的也说说啊!
我就说4楼是断章取义嘛,为什么你只看图而不看有关的说明:
-
-
AN2659_Vector_Redir.GIF
(30.26 KB)
上面那些我都看过了,可能我问题没说清楚,我的意思是在IAR里如何设置或程序中怎么处理才能编译生成包含了从主中断跳转至应用程序的中断向量表。
在8楼我已实现了自编bootloader的功能,但那是手工修改hex文件的结果。
修改对应LINK文件就可以实现,具体看一下IAR的手册!
晕,要问的是如何生成中断向量表,结果却问如何重定位中断向量表,差太远了,
生成包含了从主中断跳转至应用程序的中断向量表,这个很容易,只需要在你的Bootloader项目中,在中断向量表中填写绝对地址即可, ...
IAR中在哪里填写绝对地址?IAR跟STM8一起开始学的,还没用熟,请版主指点。
修改对应LINK文件就可以实现,具体看一下IAR的手册!
修改LINK文件是移动整个中断向量表在ROM中的地址,而中断向量表中的跳转地址还是编译器自动分配的。
晕,手册没有去看了吧,呵呵, “而不需要让编译器自动分配” 这个版主主已经说明了吧,不过LINK有个BUG,我已经给IAR发过EMAIL了,回复已经确定了是BUG,说一下版本修正!