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.

[参考译文] TMS570LC4357:TMS570LC4357:CAN 引导加载程序刷写 FreeRTOS

Guru**** 2394015 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1159250/tms570lc4357-tms570lc4357-can-bootloader-flashing-freertos

器件型号:TMS570LC4357

我正在处理引导加载程序(BareMetal)和基于 SafeRTOS 的应用程序。  我将引导加载程序矢量表@地址0x00000000、应用程序矢量表@ 0x00020000。 在跳转到应用程序后、我能够找到我的矢量表并正确执行基本系统初始化。

一旦我启动调度程序(当我启动 portSTART_FIRST_TASK 时更具体)、它 就会卡住。 此问题是基于操作系统的应用程序、而不是裸机应用程序。

您还可以共享引导加载程序和应用程序的链接器文件。

下面是两者的链接器文件、供参考  

Bootloader 链接器

引导程序(X):origin=0x00000000 length=0x00000020 vfill =0xFFFF
FLASH0 (RX):origin=0x00000020 length=0x001FFFE0 vfill = 0xffffffff
FLASH1 (RX):origin=0x00200000 length=0x00200000 vfill = 0xffffffff
SRAM (rwx):origin=0x08002000 length=0x0002D000
栈(RW):origin=0x08000000 length=0x00002000

#应用  

引导程序(X):origin=0x00020000 length=0x00000080 vfill =0xffffffff
KERR_FUNC (RX):origin=0x00020080 length=0x0000ff80 vfill = 0xffffffff
FLASH0 (RX):origin=0x00030000 length=0x001F0000 vfill = 0xffffffff
FLASH1 (RX):origin=0x00220000 length=0x00200000 vfill = 0xffffffff
堆栈(RW):origin=0x08000000 length=0x00001800
KERR_DATA (RW):origin=0x08001800 length=0x00000800
RAM (RW):origin=0x08002000 length=0x0007E000

 

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

    尊敬的 Aman:

    RTOS 支持两种类型的任务: 特权任务和非特权任务。 特权任务可以访问整个存储器映射、但非特权任务只能访问其堆栈。  在非特权模式下运行的任务不能将自身设置为特权模式。

    您的任务是否访问 MPU 保护区域? 您可以在特权任务中尝试相同的操作吗?

    我不熟悉 SafeRTOS。

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

    您好 QJ、

    感谢您的回复!!

    您能否检查我附加的链接器文件,原因是调试时出现  了 xTaskStartScheduler()的 errerROR_in_vector_table 错误。 FreeRTOS 也是如此。  

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

    链接器 cmd 看起来正常。 但.intvecs 仅占用0x20字节、请更改  

    引导程序(X):origin=0x00020000 length=0x00000080 vfill =0xffffffff

    更改为

    引导程序(X):origin=0x00020000 length=0x00000020 vfill =0xFFFF

    未使用的闪存没有有效的 ECC 值。

    您能否在应用程序链接器 cmd 文件中共享您的段配置? 段32字节对齐了吗?  

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

    很抱歉耽误你的时间!!

    .intvecs palign (32),start( lnkStartFlashAddress ),start( lnkKernelFuncStartAddr )
    fill =0xffffff{}>引导程序


    kernel_function end( lnkKernelFuncEndAddr ):

    *(kernel_function)
    }> Kern_FUNC

    .unpriv_flash palign (32),end( lnkEndFlashAddress ):

    *(.text)
    *(.const)
    }> FLASH0 | FLASH1

    .cinit align (32):{}> FLASH0| FLASH1
    .pinit align (32):{}> FLASH0 | FLASH1

    stack_data start( lnkKernelDataStartAddr ):{}> stacks
    kernel_data end( lnkKernelDataEndAddr ):{}> Kern_data
    .bss:{}> RAM
    .data :{}> RAM
    .sysmem:{}>RAM

    /*这些配置设置用于 SafeRTOS TMS570LC43x FPU 演示
    *项目。 其中包括任务数据的演示
    *被组合到已知位置、从而使 MPU 区域能够
    *被定义。 *


    __idle_hook_data__
                   : start( lnkIdleTaskDataStartAddr )
                   {}> RAM palign (0x20)
    __block Tim_data__
                   : start( lnkBlockTimeTestDataStartAddr )
                   {}> RAM palign (0x20)
    __block_q_data__
                   : start( lnkBlockQueueTestDataStartAddr )
                   {}> RAM palign (0x80)
    __DYNAL_TASK_DATA__
                   : start( lnkDynamicTestDataStartAddr )
                   {}> RAM palign (0x40)
    __LED_TASK_DATA__
                   : start( lnkLEDFlashTestDataStartAddr )
                   {}> RAM palign (0x20)
    __POLL_q_data__
                   : start( lnkPollQTestDataStartAddr )
                   {}> RAM palign (0x20)
    __binary_Semaphore_task_data__
                   : start( lnkSemaphoreTestDataStartAddr )
                   {}> RAM palign (0x40)
    __create_delete_data__
                   : start( lnkDeathTestDataStartAddr )
                   {}> RAM palign (0x20)
    _com_test_data__
                   : start( lnkComTestDataStartAddr )
                   {}> RAM palign (0x20)
    __math_test_data__
                   : start( lnkMathsTestDataStartAddr )
                   {}> RAM palign (0x40)
    __Counting_Semaphore_task_data__
                   : start( lnkCountSemTestDataStartAddr )
                   {}> RAM palign (0x40)
    __Noted_task_data__
                   : start( lnkTaskNotifyDataStartAddr )
                   {}> RAM palign (0x20)
    _timer_demo_task_data__
                   :start( lnkStartTimerTestData )
                   {}> RAM palign (0x800)
    _rec_mutex_data__
                   : start( lnkRecMutexDataStartAddr )
                  {}> RAM palign (0x400)
    __event_poll_demo_data__
                   : start( lnkEventPollDemoDataStartAddr )
                   {}> RAM palign (0x40)

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

    SafeRTOS 需要访问 SVC (vPortSVCHandler)中断等 如果无法在预期位置找到中断处理程序、则会出现 错误 ERROR_IN_Vector_table 错误。

    "vector_table"表示中断矢量表。

    我猜是您的引导加载程序异常矢量表中的分支地址不正确。

    请按如下所示进行更正:

    b _c_int00
    b 0x20000 - 0x8 = 0x1FFF8
    b 0x20000 - 0x8 = 0x1FFF8
    b 0x20000 - 0x8 = 0x1FFF8
    b 0x20000 - 0x8 = 0x1FFF8