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.

[参考译文] TMS320C6748:用大向量刷写

Guru**** 2038710 points
Other Parts Discussed in Thread: SYSBIOS, OMAP-L138
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/564944/tms320c6748-flashing-with-large-vector

器件型号:TMS320C6748
Thread 中讨论的其他器件:OMAPL138SYSBIOSOMAP-L138

我需要创建一个需要在存储器中使用相对较大矢量的应用。 我使用的电路板设计与使用256MB 左右 DDR2的 OMAPL138 LCDK 相同。 我还在使用 TI RTOS。 该应用程序在使用调试器运行时运行良好、至少在功能上可以执行应该执行的操作、但在我刷写它时失败。

我已经从计划中删除了几乎所有内容、以找到解决此问题的方法、而不是运气。 现在、我仅使用一个源文件 main.c 文件和.cfg 文件。 在此简化程序中、我 也可以打开/关闭两个 LED。 我还定义了两个特定大小的向量= UPP_buffer_size。 我对这两个矢量所做的就是再次按顺序使用虚拟值填充它们。 我的 main.c 如下所示、省去了一些函数。

当我使用 JTAG (调试模式)运行此操作时、无论我为 UPP_buffer_size、8192、16384、65536为我的两个矢量选择了什么值、这两个矢量都可以看到两个 LED 按预期工作、它们存储在0xC0000000之后的地址中、 它是在.cfg 文件中定义的 DDR (我认为我已将其附加到此 msg)。 但是、当我将此代码闪存到器件中时、我只能在 UPP_buffer_size <= 8192时使其正常工作。 它不适用于 UPP_buffer_size>8192 (例如8193、16384或65536)。 我也在 LCDK 上尝试过这种情况、观察同样的行为。 为什么在我使用 JTAG 运行时该代码起作用、而在 UPP_BUFFER_SIZE > 8192时不起作用? (对于 UPP_Buffer_Size <=8192、在闪存后工作正常)。 在哪里、似乎需要小于或等于8192的限制? 我按照使用 out2rc 和 SFH 应用程序的刷写过程将 app.out 转换为 app.bin、然后通过 UART (以及 boot.AIS)下载、在所有情况下、无论我下载到闪存的程序是什么、这都声称是成功的。 我的.cfg 也在这里、我实际上不使用 BIOS、因此我不执行 BIOS_start 等)。 我确实为 SYS/BIOS 定义了一个8192堆栈和一个8192堆、 但这并不会产生影响、因为我不使用它(即、我增大该值、并且在使用 UPP_buffer_size > 8192时仍然无法使其在闪存后正常工作)、此外、为什么它在使用 JTAG 运行时正常工作、而在闪存时不起作用?

main.c:

#define UPP_buffer_size   16384             //Dimension in words UINT16 (16位字)

uint16 uPPRxBufferI[UPP_buffer_size];
uint16 uPPRxBufferQ[UPP_buffer_size];

void main (void){
   hardware_init();         //初始化硬件
   uint32 i=0;
   while (1){
         LED_ON (4);//打开 LED 4.
         延迟(1E6); //循环虚拟延迟
         LED_ON (5);//打开 LED 5
         延迟(1e6);
         对于(i=0;i<(UPP_buffer_size);i++){
            uPPRxBufferI[i]=I;
            uPPRxBufferQ[i]=i+1;
         }

 }

///----------------------------------
// hardware_init()
///----------------------------------
void hardware_init (void){

   device_init();

void device_init (void){

   //PLL 配置-------------------------------------------------------
   setupPll0 (24);//将执行24MHz x (24+1)/2 = 300MHz SYSCLK1
   ///----------------------------------------------------------

   //引脚复用设置-------------------------------------------------------
   pinMUX();
   ///----------------------------------------------------------

   // GPIO 设置-------------------------------------------------------
   //在 PSC 中启用 GPIO 模块
   gpioPowerOn();
   gpioDirection();  
   


e2e.ti.com/.../7823.cfg_5F00_file.txte2e.ti.com/.../1537.cfg_5F00_file.txt  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    将该主题移至 TI-RTOS E2E 论坛部分。

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

    卡洛斯、

    由于您实际上并不是在启动应用程序并在应用程序中使用内核、因此最好将此主题移至其他论坛。  (很抱歉,我看到该主题已移至 TI-RTOS 论坛,但我看不到它最初来自何处。)

    但是、我猜…μ A。 从闪存引导时、DDR 时序可能设置不正确?  在调试器中运行时、GEL 文件中可能会有一些 DDR 初始化代码。  当您在没有调试器的情况下运行时、这会丢失。  您是否在从闪存引导时检查了正确的 DDR 设置?

    但是,由于您只是将这些值写入缓冲区,所以我不清楚这会影响 LED 闪烁的原因。  除非在访问未配置的 DDR 时发生了一些停止或故障?  不过、我认为最好仔细检查 DDR 设置…

    此致、
    Scott

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我对有关最佳论坛的建议持开放态度,

    无论如何、我可以尝试将 DDR 的代码从 GEL 引入源代码。 但是、我有另一个程序具有相同的 GEL、类似的.cfg 文件、只要我知道相同的工程属性和具有更大矢量的相同平台文件、并且在刷写时可以正常工作。 我根本不明白为什么它起作用、而这个更简单的原因却不起作用。 我还发现我必须将代码从 GEL 引入到代码中有点错误。 听起来似乎有些事情应该更好、或者我只是不知道(或无法查看)发生这种情况的原因的所有限制。 如果我有与调试器一起运行的软件(缓冲区正在填充正确的 DDR 存储器地址、LED 在闪烁等)、 我没有以奇怪的方式使用任何引脚/外设(简单的两个 LED)为什么 GEL 无法正确移植到.out、而我要转换为 bin 以刷写器件?

    返回到另一个正在运行的应用程序。 该向量为 UINT16类型的65536x2、闪烁正常。 它相当令人困惑。 GEL 输入会配置 DDR (与另一个相同)、然后运行 LED 并使其闪烁、并填充 UINT16数字的131072向量。 我将其转换为.bin、用 boot.AIS 刷写它、并在从闪存引导时也能正常工作。 我在那个工作正常(在同一个处理器和板上)而另一个不想做的事情上做了什么? 使用相同的 GEL、相同的平台、相同的板
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    卡洛斯、

    GEL 文件仅在 CCS 调试环境中使用、并且在创建要刷写的映像时不会自动移植该代码。  

    通常情况下、器件独立引导时的引导顺序与调试器中的引导顺序存在差异。  例如、当调试器被连接时、器件有可能立即被暂停、这意味着正常器件引导序列被暂停。  然后在调试器中加载新程序、入口点不是典型的引导入口点。   除其他外、GEL 文件提供了一种执行一些 CPU/器件初始化的方法、当从闪存或连接的处理器引导时、这些初始化将以不同的方式/自动进行处理。

    我提到 DDR 配置只是一个猜测,我想知道使用默认配置时 DDR 的某些部分是否可以访问,并且它仅适用于访问其他部分(或页面?)的程序。 默认配置存在问题。  这可能不是问题所在、但我认为在从闪存引导时检查 DDR 配置是否正确非常重要。

    此外、您可能会查看 GEL 文件中的其他初始化代码、以查看器件从闪存引导时是否存在缺失的内容。

    由于您的应用程序实际上没有使用内核,因此我将要求将此线程移至设备论坛。  我想你会得到那里的专家更好的帮助…

    此致、
    Scott

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

    卡洛斯、

    一位同事建议尝试在启动过程的早期运行一些 DDR 存储器测试。  您可以将其添加到您的应用程序配置文件中:

    VAR 启动= xdc.useModule('xdc.runtime.Startup');
    startup.resetFxn ="&memtest";

    并将 memtest()函数添加到您的应用程序中,以便对 DDR 存储器执行一些写回操作,以验证预期结果。  并且可能点亮 LED 或切换 I/O、以指示闪存引导情况下的成功/失败。

    请注意,类似的“RESET”函数将在 C 运行时初始化之前,因此它们不能使用任何 C 全局变量(因为它们尚未初始化,并且重置函数写入的任何值将在以后的 main ()过程中被覆盖)。

    也许您可以尝试一下吗?

    谢谢、
    Scott

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的,我可以尝试,谢谢!在这个 memtest()中的内存写入之后,我将缓慢地切换 LED,并查看它在闪烁时是否正常。
    出于某种原因、我在闪存方面遇到了很多问题、我甚至尝试了 TI-RTOS 应用程序、该应用程序使用 TI-RTOS 技术讲座中的 Hwi 和 Swi 使 LED 闪烁、它在使用 JTAG 时工作、但不闪烁、无论我这次是否有 DDR。 我在.cfg 文件中使用0xC0000000的复位点、并且在所有存储器空间中使用 DDR 的平台文件、它只是不会使 OMAPL138_LCDK 上的 LED 闪烁... 非常令人沮丧。 我已经多次将.out 转换为 bin、使用具有0xC0000000入口点的 ARM 引导加载程序将 boot.out 转换为 boot.AIS、通过 UART 刷写、通过闪存(使用正确的 dipswitch 设置)重置、不想闪烁。 我有另一个应用程序、相对于这些程序而言、它要复杂得多、使用相同的 GEL、类似的.cfg、相同的平台、并且那个应用程序可以正常工作、但我不知道这些应用程序不能正常工作。 在任何情况下,我都会尝试 memtest(),谢谢
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的、这很有趣(希望我觉得我接近学习一堂课)。

    我首先使用 JTAG 调试器执行了 memtest()。 实质上在 void memtest (void){...}内

    我在 memtest 中执行此操作:

    1) 1)本地声明/定义特定大小的缓冲器(它存储在 DDR 空间0xc00xxxxx 中)

    2) 2)用于切换某些 LED 的设置引脚(pinMux、gpioowerON、gpioDirection)

    3) 3)开启 LED

    4) 4)填充上面声明/定义的缓冲区

    5) 5)关闭 LED

    这会在 main()之前按预期发生。 我下载了带有调试器的程序,我可以看到并且实际上可以在 memtest Fxn 中放入断点,并看到它正在执行(打开 LED,填充缓冲区),在完成后,它会转到,*有时*,然后到达 main()。

    当我使用小于8192的缓冲区时,memtest 中声明的缓冲区会被分配到0xc002xxxx (0XC0023b90)中的某个位置,然后一切都正常,然后我从 main()开始,然后主()中的其余代码执行得像我看到的那样正常。 当我放置一个大于8192的缓冲区时、它将这个缓冲区放置在0xc001xxxx (0XC001bc58)上、但这似乎与代码中的其他内容相冲突、并且实际上 CPU 崩溃、我永远不会去 main ()。 这在某种程度上复制了我在闪存时看到的内容、但这次是在使用调试器时看到的内容。

    有时、当我放置一个大于8192的缓冲区时、它实际上会在 memtest 中循环、因为永远不会进入 main、有时它会崩溃并进入退出中止段。

    我还尝试了一个大小为131072的大型缓冲区,它将该地址的开头放在0xBxxxxxx,并循环它在 memtest 中看起来永远的内容...或者有时崩溃。 似乎我将该缓冲器放置在存储器中的某个位置、 当大小大于某个值时、我不应该这么做? 同样、我有另一个程序使用大小为131072和的缓冲区、该程序在调试器中运行良好、并在刷写之后... 但最后一项测试似乎表明内存分配有问题?

    我附加了 CCS 的屏幕截图、其中显示了大小为16384时缓冲区变量的位置:

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

    卡洛斯、

    好的、感谢您的更新。  

    不一致的结果(有时会卡在 memtest()中,有时不会访问 main())仍然使我怀疑内存时序或放置是问题的一部分。  我在输出窗口中看到 GEL 状态消息:

    DDR 初始化正在进行…。
    针对 DDR 完成 PLL1初始化:150MHz
    使用 DDR2设置
    150MHz 的 DDR2初始化完成
    …μ A

    这些是我之前提到的有关 DDR 设置的步骤、以确保在从闪存引导案例中完成。  也许您提到的那种更复杂的应用程序构建中包含了这一点吗?

    我知道您不是在盯着内核。  我想知道您是否使用调用 memtest()的编译器和链接器构建了一个更简单的“直式 C”程序,您是否会看到它按预期工作?  如果这个简单的测试也失败了、那么问题显然与 TI-RTOS 无关、结果很多、并且应该更容易将其进一步缩小、从而可能是闪存配置或引导设置等方面的问题    我想知道您能否尝试一下?

    谢谢、
    Scott

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

    我在创建新项目时从 CCS 中提供的 HelloWorld.c 程序开始、并将 main.c 替换为以下 main.c:

    本质上、程序打开一个 LED、打开另一个 LED、然后写入两个大小均为16384 16位无符号整数的缓冲区。 这种情况一直在重复。

    #define UPP_buffer_size 16384
    uint16 uPPRxBufferI[UPP_buffer_size];
    uint16 uPPRxBufferQ[UPP_buffer_size];

    void main (void){
    hardware_init();//初始化硬件
    uint32 i=0;
    while (1){
    LED_ON (4);
    延迟(1E6);
    LED_ON (5);
    延迟(1e6);
    对于(i=0;i<(UPP_buffer_size);i++){
    uPPRxBufferI[i]=I;
    uPPRxBufferQ[i]=i+1;




    我更改了链接器 cmd 文件、以便所有段都位于 DDR2上、_c_int00将放置在0xC0000000上、链接器 cmd 文件如下:
    存储器

    DSPL2ROM o = 0x00700000 l = 0x00100000 // 1MB L2内部 ROM */
    DSPL2RAM o = 0x00800000 l = 0x00040000 // 256KB L2内部 RAM */
    DSPL1PRAM o = 0x00E00000 l = 0x00008000 // 32kB L1内部程序 RAM *
    DSPL1DRAM o = 0x00F00000 l = 0x00008000 // 32kB L1内部数据 RAM *
    SHDSPL2ROM o = 0x11700000 l = 0x00100000 // 1MB L2共享内部 ROM */
    SHDSPL2RAM o = 0x11800000 l = 0x00040000 // 256KB L2共享内部 RAM */
    SHDSPL1PRAM o = 0x11E00000 l = 0x00008000 // 32kB L1共享内部程序 RAM *
    SHDSPL1DRAM o = 0x11F00000 l = 0x00008000 // 32kB L1共享内部数据 RAM *
    EMIFACS0 o = 0x40000000 l = 0x20000000 // 512MB SDRAM 数据(CS0)*/
    EMIFACS2 o = 0x60000000 l = 0x02000000 // 32MB 异步数据(CS2)*/
    EMIFACS3 o = 0x62000000 l = 0x02000000 /* 32MB 异步数据(CS3)*/
    EMIFACS4 o = 0x64000000 l = 0x02000000 /* 32MB 异步数据(CS4)*/
    EMIFACS5 o = 0x66000000 l = 0x02000000 // 32MB 异步数据(CS5)*/
    SHRAM o = 0x8000000 l = 0x00020000 // 128KB 共享 RAM */
    DDR2 o = 0xC0000000 l = 0x20000000 // 512MB DDR2数据*/


    部分

    .text > DDR2
    .text:_c_int00 > 0xC0000000 //添加
    .stack > DDR2
    .bss > DDR2
    .cio > DDR2
    .const > DDR2
    .data > DDR2
    .switch > DDR2
    .sysmem > DDR2
    .far > DDR2
    .args > DDR2
    .ppdinfo > DDR2
    .ppdata > DDR2

    /* COFF 段*/
    .pinit > DDR2
    .cinit > DDR2

    /* EABI SECTIONS *
    .binit > DDR2
    init_array > DDR2
    .neeardata > DDR2
    .fardata > DDR2
    .rodata > DDR2
    .c6xabi.exidx > DDR2
    .c6xabi.extab > DDR2


    这会将_c_int00放在0xC0000000中、然后将 uPPRxBufferI 从0xc0008080开始、将 uPPRxBufferQ 从0xc0000080开始(主器件进一步向下)、从调试器加载并运行良好(闪烁 LED 和填充的缓冲区)、I Flash 部件并通过闪烁 LED 来工作、 没问题、我使用的是16384大小矢量、这是在另一个程序中不起作用的矢量。 闪存的这个使用相同的引导。AIS 我一直在使用、因此它不应该是任何时序、因为它是同一个板、相同的部件、实际上它甚至不是定制板、而是 LCDK。 这看起来像是配置问题、而不是时序问题。 我使用的是与其他未运行的程序相同的 boot.AIS、我没有在源代码中以任何方式设置 DDR、我只依赖 boot.AIS 在引导时执行该操作。 我生成 boot.AIS、我依赖为 LCDK 提供的给定配置文件、我在 AISGen 应用中使用该文件从 boot.out 创建 boot.AIS (boot.out 是编译的输出、所需入口点= 0xC0000000)。

    我能够使用某些程序运行它、就像刚刚完成的程序一样。 我还不确定其他程序有何不同、因为它使用相同的 boot.AIS、相同的入口点、但它是使用 TI-RTOS 通过.cfg 文件进行设置的。 即使我不启动内核它可能正在使用一些我不应该使用的内存空间...使用 TI-RTOS 的程序必须某种程度上正确,我无法确定该内核中的配置有何不同。 (笑声) 我可以复制该项目并从那里开始、但这可能不会达到我所面临问题的最根本。

    ----

    我还使用适用于 C6000的 tyi-RTOS 模板->内核示例->最小示例从头创建了一个项目。 它使用任务 Fxn、其中我放置了大缓冲器的 LED 切换和填充。 就像这样:

    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include

    #define buffer_size 16384

    uint16 uPPRxBufferI[buffer_size];

    void taskFxn (UARg a0、UARg A1)

       uint32 i=0;
       while (1){
          LED_ON (4);
          延迟(1E6);
          LED_ON (5);
          延迟(1e6);
          对于(i=0 <BUFFER_SIZE;i++){
             uPPRxBufferI[i]=I;
          }
       }



    /*
     * ==== main ====
     *
    int main()

       hardware_init();// init 硬件使用 CSL
       BIOS_start();   /*不返回*/
       返回(0);

     只要 buffer_size <16384、它就从闪存运行。 假设 buffer_size 是32768、它不是(但它在任何情况下都与调试器一起运行)。 这也是使用 LCDK 的... 并将此额外行用于最小应用程序提供的.cfg、这样应用程序将从0xC0000000开始:

    将代码刷写到目标时、VAR Hwi = xdc.useModule('ti.sysbios.family.c64p.Hwi');//已添加
    Hwi.resetVectorAddress = 0xC0000000;                //在刷写代码时为 ADedd。 它就是您的理想选择
                                              //存储开始应用的位置

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

    我进行了仔细检查、简单应用程序不使用 TI-RTOS、但基于空项目配置、即使在使用两个大小为131072的向量时也能正常运行。 源代码是相同的,但在运行简单的源代码时闪烁良好,在使用 ti-RTOS ....刷写源代码时中断。

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

    我还检查了 GEL 中 DDR 的设置、并将它们与 AISGen 中使用的设置进行了比较、它们是不同的。

    GEL 使用以下代码:

    DRPYC1R:C4

    SDCR:13C832

    SDCR2:0

    SDT1MR1:264A3209

    SDT1MR2:3C14C722

    SDRCR:C0000492

    AISGen 的配置文件使用以下内容:

    DRPYC1R:C5

    SDCR:134832

    SDCR2:相同

    SDT1MR1:相同

    SDT1MR2:相同

    SDRCR:00000492

    我使用上面 GEL 使用的相同参数创建了另一个 boot.AIS、但得到的结果相同。 大向量无法闪烁、小向量闪烁

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

    尊敬的 Carlos:

    很抱歉耽误你的时间,我只是回到这里。  感谢您提供更多详细信息。  

    这都是非常令人困惑的。  

    您提到的空项目是 TI-RTOS 空项目还是编译器的空项目(Project -> New CCS Project->Empty Project (with main.c))?  

    我想回到这样的情况:您将 memtest()作为复位函数运行(在程序入口点和堆栈指针初始化之后立即调用),以及它的工作方式不一致。  ‘该测试的唯一一个问题是初始调用复位函数和存储器放置。  我看不出这是怎么会失败的,但在 main()中运行测试而不使用 TI-RTOS 将始终运行。  

    我想,如果您的应用程序具有在 memtest()之前运行的其他复位函数(其他函数可能由您的应用程序配置),则可能会导致差异。

    查看您的测试,我看到您已将所有内容都放入 DDR2中,而且您正在写入两个数组,但不检查写入后的回读是否显示预期值。  我原来想的是从内部存储器运行的测试,但对 DDR2进行内存访问/完整性检查,基本上是对 DDR2位置连续写入/读取的“均热”测试。  并使用 LED 指示读回的值是否正确、或者是否出现故障。  我想知道您是否可以调整测试来执行该操作?  如果它传递为空、请作为复位函数重试?

    此外,如果您可以签入调试器,从_c_int00入口点单步进入 memtest()复位函数,查看是否有任何其他函数在 memtest()之前调用?  加载程序后,您的项目可能会自动配置为“Go main”。  您可以通过“工具”->“调试器选项”->“程序/自动运行和启动选项”来禁用此功能(以便可以从_c_int00开始),然后在“运行至”符号:main 之后取消选中“在程序加载或重新启动时”。

    很抱歉,目前我没有更好的想法。  但是、如果您可以获得这些额外的数据点、这些数据点将排除更多的问题。  我还将询问其他想法…

    此致、
    Scott

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

    您好!

    我使用的空项目是 CCS 中为 TI-RTOS 提供的模板之一。 通过执行以下操作可以实现这一点:

    Project->New CCS Project

    +在"Target (目标)"部分选择 LCDK6748

    +选择高级设置并展开其读取 C6000 TI-RTOS 的位置(在 SYS/BIOS 下方)

    +展开内核示例、然后我选择最小值、"此示例具有相当小的.cfg、该.cfg 是为静态应用程序设置的、其中所有对象都是静态定义的(通过配置工具和/或目标结构)。  动态内存分配已禁用。 cfg 文件创建了一个单任务,该任务包含几个 print 语句和一个 Task_sleep()调用。”

    我使用这个寄存器只需写入和读取一个 UINT16值的缓冲器、并打开和关闭 TI LCDK OMAPL138板上运行的两个 LED。 我使用了提供的 C6748_LCDK.gel。 我只需通过添加两行命令它 从0xC0000000开始运行来更改.cfg。 无论缓冲区大小如何、它都在调试器下运行、但当我刷写此程序时、并不总是如此。 当缓冲区为16384大时、程序闪烁正常、当缓冲区为32768时不闪烁。 我可以看到它何时运行、因为每次从缓冲区读取值时、我都可以看到 LED 闪烁。 我不确定您对内部存储器和 DDR2的建议是什么、您能提供更多的详细信息吗? 我想从 DDR2运行、我使用的使用简单非 TI-RTOS 的程序确实可以正常运行。

    我认为、如果有人能够复制我要做的事情、这将会有所帮助。 我不使用非标准硬件、而是 TI 评估板(LCDK、我认为它有两三个不同的名称、但通常是 LCDK、其中包含 OMAP-L138)。

    再说一次,main.c 函数是这样的:我认为它中没有任何额外的普通函数:

    /*
     * ==== main.c ======
     *

    #include
    #include
    #include
    #include

    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include

    #define buffer_size 32768

    uint16 uPPRxBufferI[buffer_size];//这是缓冲区

    //外设寄存器(CSL 库)-------------------------------------------------------
    //系统配置寄存器覆盖
    CSL_SyscfgRegsOvly sys0Regs =(CSL_SyscfgRegsOvly)(CSL_SYSCFG_0_reg);
    //PSC 寄存器覆盖
    CSL_PscRegsOvly psc1Regs =(CSL_PscRegsOvly)(CSL_PSC_1_regs);
    //CSL_PscRegsOvly psc0Regs =(CSL_PscRegsOvly)(CSL_PSC_0_regs);
    // GPIO 寄存器覆盖
    CSL_GpioRegsOvly gpioRegs =(CSL_GpioRegsOvly)(CSL_GPIO_0_regs);


    静态 void hardware_init (void);
    静态 void device_init (void);
    静态空 pinMUX (空);
    静态空延迟(uint32计数);
    静态空 gpioPowerOn (空);
    static void gpioDirection (void);
    静态空 LED_ON (unsigned int);

    /*
     * ==== taskFxn ====
     *
    void taskFxn (UARg a0、UARg A1)

       uint32 i=0;
       while (1){
          对于(i=0 <BUFFER_SIZE;i++){
             uPPRxBufferI[i]=I;
          }
          for (i=0;<BUFFER_SIZE;i++){)
             if (uPPRxBufferI[i]=i){
                LED_ON (4);
                延迟(5E6);
                LED_ON (5);
                延迟(5e6);
             }
          }
       }



    /*
     * ==== main ====
     *
    int main()

       hardware_init();//初始化硬件
       BIOS_start();   /*不返回*/
       返回(0);



    void hardware_init (void){
       device_init();


    void device_init (void){

       //PLL 配置-------------------------------------------------------
       //setupPll0 (24);//将执行24MHz x (24+1)/2 = 300MHz SYSCLK1
       ///----------------------------------------------------------

       //引脚复用设置-------------------------------------------------------
       pinMUX();
       ///----------------------------------------------------------

       // GPIO 设置-------------------------------------------------------
       //在 PSC 中启用 GPIO 模块
       gpioPowerOn();
       gpioDirection();



    void pinMUX (void){

       //要写入的密钥以启用引脚复用寄存器进行写入
       sys0Regs->KICK0R = 0x83E70B13;
       sys0Regs->KICK1R = 0x95A4F1E0;


       sys0Regs->PINMUX13 |=((CSL_SYSCFG_PINMUX13_PINMUX13_15_12_GPIO6_12)\
                      <<(CSL_SYSCFG_PINMUX13_PINMUX13_15_12_SHIFT))\
                      |((CSL_SYSCFG_PINMUX13_PINMUX13_11_8_GPIO6_13)\
                      <<(CSL_SYSCFG_PINMUX13_PINMUX13_11_8_SHIFT));//LED D4、D5


    空延迟(uint32计数){
       易失性 UINT32 tempCount = 0;

       对于(tempCount = 0;tempCount < count;tempCount++){
          /*等待一段时间的虚拟循环 */
       }


    void gpioPowerOn (void){

       易失性 uint32 pscTimeoutCount = 10240u;
       uint32 temp = 0;

    //为 PSC 中的 GPIO 模块加电并启用 GPIO 模块
       psc1Regs->MDCTL[CSL_PSC_GPIO]=
             (((psc1Regs->MDCTL[CSL_PSC_GPIO]和0xFFFFFFE0)
                   | CSL_PSC_mdstat_State_enable);

    // Kickstart 启动 Enable 命令
       temp = psc1Regs->PTCMD;
       temp =(temp & CSL_PSC_PTCMD_GO0_MASK)
             |(CSL_PSC_PTCMD_GO0_SET << CSL_PSC_PTCMD_GO0_SHIFT);

       psc1Regs->PTCMD |= temp;

    //延迟足够的时间来发生电源状态转换(状态未检查、这是希望的结果)
       while ((((psc1Regs->PTSTAT 和(CSL_PSC_PTSTAT_GOSTAT0_IN_TRANSITION))!= 0)
             &&(pscTimeoutCount > 0)){
          pscTimeoutCount--;
       }


    void gpioDirection (void){

       // LED D4=GPIO6-13| LED D5=GPIO6-12

       //将 GPIO6_13 (GPIO6_13_PIN)配置为输出 LED4
       CSL_fins (gpioRegs->Bank[3].DIR、GPIO_DIR_DIR13、0);

       //将 GPIO6_12 (GPIO6_12_PIN)配置为输出 LED5
       CSL_fins (gpioRegs->Bank[3].DIR、GPIO_DIR_DIR12、0);



    /*
     *打开/关闭 LED
     *
    void LED_ON (unsigned int led){
       开关(LED){
       情况0:
          CSL_fins (gpioRegs->Bank[3].out_data、GPIO_OUT_DATA_OUT13、0);   //LED4
          CSL_fins (gpioRegs->Bank[3].out_data、GPIO_OUT_DATA_OUT12、0);   //LED5
          中断;
       案例4:
          CSL_fins (gpioRegs->Bank[3].out_data、GPIO_OUT_DATA_OUT13、1);   //LED4
          CSL_fins (gpioRegs->Bank[3].out_data、GPIO_OUT_DATA_OUT12、0);   //LED5
          中断;
       情况5:
          CSL_fins (gpioRegs->Bank[3].out_data、GPIO_OUT_DATA_OUT13、0);   //LED4
          CSL_fins (gpioRegs->Bank[3].out_data、GPIO_OUT_DATA_OUT12、1);   //LED5
          中断;
       默认值:
          中断;
       }



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

    尊敬的 Carlos:

    很抱歉耽误你的时间,我已经上班/外出了,现在就回到这里了。  感谢您提供更多详细信息以及修改您的测试应用。

    有关从 DDR2…运行应用程序的说明 我所得到的是、如果 DDR2时序不是很正确、不是尝试从同一内存运行代码、而是从内部内存运行测试代码、 并通过写入/读取测试 DDR2内存访问,以确保 DDR2没有任何问题。  不是长期解决方案、而是仅作为测试、以确保 DDR2运行正常。  如果内存配置不正确,可能会解释为什么有时您的测试正常工作,有时测试不工作或崩溃。

    我想我可能可以从 TI 站点的同事那里借用 LCDK 板,但我现在没有可以尝试重新创建此测试的板。  

    在您发布的代码中,对 setupPLL0()的调用被注释掉。  这是故意的、更具体地说、您是否配置了 PLL1?

    此外、您是否曾尝试从_c_int00入口点在调试器中单步执行应用程序、以查看是否正在运行任何复位函数?

    我刚刚在 TI 论坛上搜索“Problem boot flash C6748”,并找到了很多点击。  我从大约6个月前的一个报告中看到一个报告指出了 AISgen 的一个问题、这让我想知道您是否会遇到类似的问题: e2e.ti.com/.../466012 您正在使用哪个版本的 AISgen?

    明天…、我将与 TI-RTOS 论坛主持人联系、了解我可以与谁讨论器件组、以便为您解决此问题

    此致、
    Scott

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

    关于 AISgen、我将 AISgen 用于 D800K008版本1.9。

    有关 setuppll0 (24)的说明。 我只是为了测试而注释掉了它、但没有任何效果。 本质上、当从调试器运行时、GEL 文件会设置此设置、如果从闪存运行、则引导也会设置此设置。AIS 也会设置它、因此除了在 main 中再次设置 pllt0之外、它实际上没有任何效果。 问题以与之前解释的相同的方式重现,是否注释掉。

    是的、我认为_c_int00中没有任何复位函数。

    我认为、一旦您保持 LCDK 并将我发送给您的代码放入其中、我们就可以从 TI-RTOS 6000的最小模板开始...希望这将点亮我们。 除非我使用的是 AISgen 的旧版本....

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

    尊敬的 Carlos:

    PLL1的设置如何?  这是对 DDR2至关重要的一个。  在闪存引导情况下、PLL1的设置是否与 CCS GEL 中的设置完全相同?

    您是否尝试从_c_int00实际步进?  务必要了解是否有任何正在运行的重置功能可能会更改某些设置。  根据您的软件版本、可能存在或不存在某些内容。

    您正在使用哪个版本的 SYS/BIOS?  是 SDK 的这一部分、还是您专门安装的组件?

    您的 LCDK 板的确切名称和修订号是什么?  您之前提到过、它包含 OMAP-L138。  在闪存启动情况下、ARM 端是否有任何可能干扰您的测试的代码引导?  

    谢谢、
    Scott

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我将其移至器件论坛、以查看他们是否有一些想法。