工具/软件:
您好、
当我从一个应用程序(引导加载程序)跳转到 FreeRTOS 应用程序时、xTaskCreate 函数失败。 问题
中断向量表中。 在创建任务期间、它会调用“BaseType_t xRunningPrivileged = prvRaisePrivilege ();“、
但我没有找到“prvRaisePrivilege “的定义。 这应在“portasm.asm “中定义、如下所示:
/source/os_mpu_wrappers.c:/* TCJ:检查必须为零、请参阅 portasm.asm 中的 prvRaisePrivilege */
我无法在中找到它
github.com/.../portASM.asm
这是我的引导加载程序应用程序的链接器脚本内容:
移动数据
{
矢量 (RX):origin = 0x00000000、length = 0x00000020 /*矢量表*/
Bootloader (RX):origin = 0x00000020、length = 0x0001FFE0/* Bootloader 代码/数据(总共 128KB,包括矢量)*/
栈 (RW):原点= 0x08000000、长度= 0x00001500
RAM (RW):origin = 0x08001500、length = 0x0007EB00 /*0x00080000*//* 512KB RAM */
}
很重要
{
.intvecs :> vectors
.text:> bootloader
.const :> bootloader
.cinit:> bootloader
.data :> RAM
.bss :> RAM
.stack :> RAM
.sysmem :> RAM
fee_text_section:{}>引导加载程序
fe_const_section:{}>引导加载程序
fee_data_section:{}> RAM
}
以下是 FreeRTOS 应用链接器脚本内容
移动数据
{
矢量 (X):origin=0x00020000 length=0x00000020
内核 (RX):origin=0x00020020 length=0x00008000
FLASH0 (RX):origin=0x00028020 length=0x001D7FE0 /* 2MB - 0x8020 */
栈 (RW):origin=0x08000000 length=0x00000800
Kram (RW):origin=0x08000800 length=0x00000800
RAM (RW):origin=(0x08000800+0x00000800) length=(0x0007F800 - 0x00000800)
}
很重要
{
.intvecs :{}>向量
.kernelTEXT align(32):{}>内核
.cinit align (32):{}>内核
.pinit align(32):{}>内核
.text align(32):{}> FLASH0
.const align(32):{}> FLASH0
.kernelbss :{}> kram
.kernelHEAP :{}> RAM
.bss :{}> RAM
.data :{}> RAM
fee_text_section:{}> FLASH0
fe_const_section:{}> FLASH0
fee_data_section:{}> RAM
}
注意 — 您可以忽略 Fee_parameters。 没有这些参数、我就遇到了问题。
在搜索时、我看到了以下链接、
e2e.ti.com/.../tms570lc4357-bootloader---appication---application-with-freertos-fails-on-task-creation
e2e.ti.com/.../tms570lc4357-bootloader-to-application-jump-leads-to-error
在第一个链接之后、我更改了引导加载程序应用中的 hl_sys_intvecs.asm 文件、以将 SVC 中断重定向到空闲 RTOS 矢量、但实际上却是如此
无法找到“prvRaisePrivilege"的“的定义。 请确认是否需要进行 HL_sys_intvecs.asm 修改。
以下是引导加载程序的 hl_sys_intvecs.asm:
.sect “.intvecs"</s>“
.arm
--------------------------------------------------------------------------------------------
;中断例程的导入引用
.ref _c_int00
.ref phantomInterrupt
.def resetEntry
--------------------------------------------------------------------------------------------
;中断矢量
resetEntry
b _c_int00
UndefEntry
BundefEntry
movw r0、#0xFFF8;0x0001FFF8 的低 16 位
movt r0、#0x0001;0x0001FFF8 的高 16 位
BX r0
svcEntry
; b svcEntry <--替换为下面的行
;将地址 0x00020008 载入 r0
movw r0、#0x0008;低 16 位
movt r0、#0x0002;高 16 位-> 0x00020000
BX r0;分支到应用程序 SWI 处理程序
prefetchEntry
B prefetchEntry
DataEntry
b DataEntry
反相中断
LDR PC、[PC、#–0x1b0]
LDR PC、[PC、#–0x1b0]
--------------------------------------------------------------------------------------------
请注意、当我添加额外指令时、我必须为 int 提供额外的空间。 引导中的矢量就会加载
链接器脚本的修改方式如下:
移动数据
{
矢量 (RX):原点= 0x00000000、长度= 0x00000040
引导加载程序 (RX):origin = 0x00000040、length = 0x0001FFC0
栈 (RW):原点= 0x08000000、长度= 0x00001500
RAM (RW):origin = 0x08001500、length = 0x0007EB00 /*0x00080000*//* 512KB RAM */
}
以下是适用于免费 RTOS 应用的 hl_sys_intvecs.asm(我尚未进行任何修改):
.sect “.intvecs"</s>“
.arm
--------------------------------------------------------------------------------------------
;中断例程的导入引用
.ref _c_int00
.ref vPortSWI
.ref phantomInterrupt
.def resetEntry
--------------------------------------------------------------------------------------------
;中断矢量
resetEntry
b _c_int00
UndefEntry
BundefEntry
b vPortSWI
prefetchEntry
B prefetchEntry
DataEntry
b DataEntry
反相中断
LDR PC、[PC、#–0x1b0]
LDR PC、[PC、#–0x1b0]
--------------------------------------------------------------------------------------------
请帮助解决上述问题。 提前感谢!