工具/软件:Code Composer Studio
您好、先生、
我对矢量表有疑问。
如果有两个项目:引导加载程序(从闪存0x33FFF6开始)+应用程序(从整个闪存的中间扇区开始)。
引导加载程序和应用程序具有相同的 IRQ ISR。
我的问题是:
如何处理 IRQ 的矢量表? 是否需要重新映射矢量表? (作为 ARM7、Cortex-M3、它有矢量表重新映射寄存器来设置它。)
谢谢。
此致、
文森特
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具/软件:Code Composer Studio
您好、先生、
我对矢量表有疑问。
如果有两个项目:引导加载程序(从闪存0x33FFF6开始)+应用程序(从整个闪存的中间扇区开始)。
引导加载程序和应用程序具有相同的 IRQ ISR。
我的问题是:
如何处理 IRQ 的矢量表? 是否需要重新映射矢量表? (作为 ARM7、Cortex-M3、它有矢量表重新映射寄存器来设置它。)
谢谢。
此致、
文森特
尊敬的 David:
感谢您的回答。
因此,我的理解是:
DSP28335 无法重新映射中断向量。
2. 在次级引导加载程序和应用程序中使用"InitPieVectTable();"来初始化它们自己的中断表。
但如何 区分这两个矢量表?
例如:(下面的地址只是一个示例,而不是实际地址)
1) 1)次引导基址= 0x0000h; 应用程序基址= 0x6000h
2) 2)次级引导和应用都具有 SCI 中断。 SCI 中断矢量表的实地址为0xFC (当 IRQ 发生时、第一个访问地址)。
3) 3)在次级引导中: SCI ISR 路由条目地址= 0x1234。 (此地址由编译器编译)
因此 、闪存中地址0xFC 的数据:
闪存地址 数据
0xFC 0x12
0xFD 0x34
4)在 APP 中:SCI ISR 路由入口地址= 0x789a (该地址由编译器编译,十六进制的应用数据应由升级函数传输并写入闪存)
地址0x60fc 的数据(如果有重映射函数) 数据
0x60fc 0x78
0x60fd 0x9a
现在没有重映射函数、因此我不知道如何排列 ISR 路由条目地址。
当然,次引导不能使用 IRQ,请使用查询模式从 PC 接收数据。 但我的问题是:在没有矢量重映射功能时如何查找应用程序的 ISR 条目地址。
我以前使用过没有矢量重映射功能的 TI MSP430,我的 MSP430解决方案是:
1)在次引导中,不使用 IRQ,只使用查询模式。
2) 2)在次级引导中 、编写了一个汇编语句、强制 PC 跳转到地址0x60fc、以便在 PC 在应用程序中运行时出现 IRQ 时、它可以找到应用程序的正确 ISR 路由条目地址。
我的问题是:
a.如果我必须遵循 MSP430方法来处理 DSP 28335中的矢量表?
b.处理向量表的任何其他解决方案,或者无需处理它,只需使用 InitPieVectTable()来初始化向量表? 或其他配置需要进行配置?
谢谢。
此致、
文森特
尊敬的 Vincent:
这两个项目(引导加载程序和应用程序)中的每一个都是独立的 CCS 项目。 每个都有自己的 PIE 中断矢量、这些矢量指向自己的 ISR。 这些地址由链接器在工程编译时解析。 您无需在此处执行任何特殊操作。 一次只运行一个项目。 引导加载程序通常在复位后运行。 它将初始化 PIE 矢量、然后执行您希望执行的任何操作(例如、验证应用或将新应用下载到闪存)。 然后、它将控制权转移给应用程序。 有 e2e 帖子介绍了如何执行此操作、例如:
https://e2e.ti.com/support/microcontrollers/c2000/f/171/t/273790
此时、应用程序将从头开始运行、并使用其矢量初始化 PIE 矢量。 引导加载程序不再运行。 如果需要运行引导加载程序、则必须将执行链接回引导加载程序的开头、此时 PIE 矢量再次使用引导加载程序矢量进行初始化。
这样可以清除它吗?
此致、
David
尊敬的 David:
非常感谢您的专业响应。
因为我以前没有使用 DSP、所以我的经验都基于 ARM7或 Cortex-MX、这是 DSP 的不同内核。 阅读您的响应并链接有关从引导到应用程序的主题后。 我正在评估升级设计,稍后将尝试此方法,可能会出现新问题,然后我认为需要创建新主题。
当前我只与您确认两点:
关于 矢量表、我不需要在两个项目(次级引导+应用)中修改任何有关矢量表的内容。 我唯一需要做的就是为 secondary 引导和 app 分配不同的闪存扇区、对吧?
处理该矢量表似乎非常简单。 是否有任何文档详细描述矢量表?
2. 您在链接线程中提到从引导跳转到应用程序是使用"asm (" lb 0x123456");"。 我的问题是我的应用程序大小是否大于一个闪存段,例如,应用程序大小>一个段大小,应用程序大小在 Flash_E + Flash_D 中 (从0x31 8000h 到0x32 7FFFh)。 在本例中、当从引导模式跳转到应用程序时、
我需要使用:
asm (" lb 0x327FFFE"); 、
对吧? 跳转地址始终是应用项目最后一个闪存部分的最后两个字节?
再次感谢您的帮助。
此致、
文森特
文森特
[引用用户="Vincent Hu"]
关于 矢量表、我不需要在两个项目(次级引导+应用)中修改任何有关矢量表的内容。 我唯一需要做的就是为 secondary 引导和 app 分配不同的闪存扇区、对吧?
[/报价]
正确。
[引用用户="Vincent Hu"]
2. 您在链接线程中提到从引导跳转到应用程序是使用"asm (" lb 0x123456");"。 我的问题是我的应用程序大小是否大于一个闪存段,例如,应用程序大小>一个段大小,应用程序大小在 Flash_E + Flash_D 中 (从0x31 8000h 到0x32 7FFFh)。 在本例中、当从引导模式跳转到应用程序时、
我需要使用:
asm (" lb 0x327FFFE"); 、
对吧? 跳转地址始终是应用项目最后一个闪存部分的最后两个字节?
[/报价]
我想您是指0x327FFE。 是的、假设 您选择的硬地址是包含程序的闪存扇区的最后一个(最高寻址)字。 这是另一个 e2e 线程中的建议。 这里的想法只是为了使硬地址不受程序的影响。 通过使用包含程序的存储器的最后两个字、硬地址 LB 指令不会破坏程序使用的存储器。
此致、
David