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.

[参考译文] SYSBIOS:退出/停止 SYSBIOS 调度程序

Guru**** 2391045 points
Other Parts Discussed in Thread: C2000WARE, SYSBIOS

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1006928/sysbios-exiting-halting-sysbios-scheduler

器件型号:SYSBIOS
主题中讨论的其他器件:C2000WARE

大家好、

使用 C2000Ware 串行闪存内核示例、示例应用程序会跳转到代码加载入口点。 这是完全可以接受的、因为应用程序没有调度程序或中断。 在我们的应用中、我们希望使用类似的方法、但是我们将 TI 的 SYSBIOS 用于各种 SW/HW 中断和任务。 问题是、我们如何安全地停止中断和任务的调度/执行、以便能够执行代码加载程序?

我当前的方法是退出 BIOS、如下所示:

  1. 在应用程序配置中将 SYSBIOS 退出任务的数量限制为1
  2. 在启动调度程序之前,请向 System_atexit (System_AtexitHandler) Exit_Handler 注册我们的退出任务。
  3. 使用  BIOS_start()启动调度程序
  4. 当接收到一个合适的 SCI 消息来启动代码加载时、调用  BIOS_exit (code_load)、其中我们提供了一个合理的状态代码来指示这是一个'code load'退出
  5. 在我们的退出处理程序中、检查退出原因。 如果要执行代码加载过程、则分支到代码加载程序的入口点
  6. 代码加载程序对闪存进行重新编程、然后将器件复位

我在这里附上了一个简化版本的退出处理程序

void Exit_Handler(int reason)
{
    switch(reason)
    {
        case(BIOS_EXIT_CODE_LOAD):
            Exit_CodeLoad();
            // Will never return to here
            break;
        default:
            break;
    }

    return;    
}

static void Exit_CodeLoad(void){
    // Branch to static code loader entry point
    asm("    MOVL XAR7, #0x81000");
    asm("    LC *XAR7");
    // No return
}

这是有效的方法吗? 主要是、我担心这种方法会跳过在用户的注册退出函数之后应该发生的任何其他退出处理。 我 已经实现了这一点、它似乎可以按我的需要工作; 调度程序暂停、代码加载程序无故障运行。 然而,我对可能出现的问题感到关切。 是否有任何有关 XDC/SYSBIOS 退出过程的 TI 文档?

谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这对我来说似乎足够了。 如果您担心启用了持续中断、可以在加载程序的开始位置放置一个断点来进行双重检查、并检查 PIEIER 和 IER 以及寄存器是否存在意外的未启用状态。

    惠特尼