主题中讨论的其他器件:UNIFLASH
大家好、 我目前正在尝试将引导加载程序实现到 TI-RTOS 的代码中。 但是、除了 notROTS 示例之外、我找不到任何其他示例。 因此、我按照给定的示例和一些线程的答案来处理它。
在实现过程中、我在 命令行中使用 BSL 脚本编写器测试代码、我很不幸运。 因此、我认为我应该只使用 CCS 调试模式进行调试、我已经成功地使 它运行。 我开始调试、然后将 script_1.txt 上载到电路板并重新开始调试。 程序工作正常、可以从 BIOS_exit 触发跳转模式。 但是、对于 BSL 脚本编写器来说、这个仍然不起作用。 因此、我提出了一种不同的方法。 我从程序中生成一个.txt 文件、并尝试通过 Uniflash 进行上传。 这个方法可以上传程序并且只有当我选择擦除配置来擦除并且只下载必要的段时、程序才起作用。 这个结果让我觉得我对代码有疑问、那就是当我运行 BSL 脚本编写器时擦除主存储器的任何内容。 但是、我找不到导致它的任何东西。 如果有人有任何想法、请提供帮助。
我将使用按钮式 TI-RTOS 示例测试 BSL、下面是我进行更改的一些步骤
1.cmd 文件:
a.闪存(RX):origin = 0x00004000,length = 0x000FC000
B.各款
{
.intvecs:> app_base
.text:> FLASH
.const:> FLASH
.rodata:> FLASH
.cinit:>闪存
.pinit:> FLASH
init_array:> FLASH
.vtable:>0x20000000
2..cfg 文件
m3Hwi.resetVectorAddress = 0x4000;/* App base *
3.主要应用:
a.添加 Jumpotootloader 函数
void JumpToBootLoader (void);
空 JumpToBootLoader (空)
{
/*在进入之前,我们必须确保关闭 SysTick 及其中断
*引导加载程序! *
map_SysTickIntDisable();
map_SysTickDisable();
/*禁用所有处理器中断。 而不是逐个禁用它们
*时间、执行到 NVIC 的直接写入来禁用所有外设
*中断。 *
NVIC->icer[0]= 0xffffffff;
NVIC->icer[1]= 0xffffffff;
NVIC->icer[2]= 0xffffffff;
NVIC->icer[3]= 0xffffffff;
//从引导加载程序的矢量加载栈指针
//__set_msp (*(volatile uint32_t*) 0x00);
/*将控制权返回给引导加载程序。 这是对 SVC 处理程序的调用
*。 *
(*(void (*)(void))(*(uint32_t*) 0x2C))();
}
2.添加函数 RTOS 退出(main_tirtos.c 的第126行)
int main (空)
{
pthread_t 线程;
pthread_attr_t atttrs;
struct sched_param primParam;
int retc;
Board_init();
/*使用默认值初始化属性结构*/
pthread_attr_init (atttrs);
/*设置优先级、分离状态和堆栈大小属性*/
priParam.sched_priority = 1;
retc = pthread_attr_setschedparam (&attrs、&priParam);
retc |= pthread_attr_setdetachstate (&attrs、pthread_create_detachstate);
retc |= pthread_attr_setstacksize (&attrs、THREADSTACKSIZE);
如果(retc!= 0){
/*无法设置属性*/
while (1){}
}
retc = pthread_create (&thread、&attrs、mainThread、NULL);
如果(retc!= 0){
/* pthread_create()失败*/
while (1){}
}
System_atexit (JumpToBootLoader);
BIOS_start();
返回(0);
}
4. rtos.c
在 BIOS_exit (1);触发(buttonled.c 处的第146行)
if (button_ev_clicked =(事件和 button_ev_clicked))
{
bStats.clicked++;
bStats.lastpresedduration =
button_getLastPresedDuration (handle);
/*将事件放入环状缓冲区进行打印*/
RingBuf_Put (&ringObj、事件);
if (LED_State_闪烁= LED_getState (LED))
{
LED_STOPINCING_FLOCING_LECK_LED
LED_setoff (led);
}
其他
{
LED_TOGGLE (led);
BIOS_exit (1);
}
}
非常感谢

