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.

[参考译文] CCS/TMS320C6748:如何从 C6748加载 PRU

Guru**** 2538955 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/573861/ccs-tms320c6748-how-to-load-pru-from-c6748

器件型号:TMS320C6748

工具/软件:Code Composer Studio

我找到了一个编译器 software-dl.ti.com/.../pru-software-support-package

输出为*。out 和*。object、两者均为 ELF 格式。 这需要进一步处理、以便 C6748可以将其传输到 PRU 指令存储器中。 还有其他程序可以做到这一点吗?

是否可以让 CCS 编译 PRU 项目? 我可以从首选项中看到这些工具、但看不到创建 PRU 项目的任何方法。

谢谢、

Mike

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

    我已将其转发给设计团队。 他们的回复将在此处发布。

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

    我找到了一个网页、其中显示了具有不同时钟速率的不同 PRU。 我开始深入了解我的手册、C6748技术参考的第119页上有一个图表、显示 PRU 从 SYSCLK2获取其时钟。 如果我以最大(456MHz)频率运行 DSP、PRU 是否会以228频率运行? 你可以告诉我还没有弄清楚如何打开它、但我已经准备好了!
    Mike
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    因此、我取得了一些进展、打开了 PRU 电源、可以从 CCS 调试器中看到它的存储器。 版本 ID 为0x4E825900 -我认为4E8是指 C6748、因为子系统的所有版本 ID 似乎都是从它开始的。 但是、我拥有哪个版本的 PRU 硬件? C6748手册说有扫描指令、但 Wiki 页面说较新的 PRU 没有扫描。 我不知道如何使用它、但很高兴知道我处理的是哪个版本的硬件。

    我还找到了《PRU 汇编语言工具用户指南》、其中解释了我的许多问题。 即使我无法在 CCS 中执行此操作、我仍然可以创建*。asm 文件、汇编并将其与 clpru 链接、 然后、将该输出作为整个块、我必须使用自己的代码根据文件中的加载地址将其加载到 PRU 存储器中。 我很难相信我找不到任何以前没有这样做的人! 我的网络搜索只是找不到任何东西、所以如果有人有任何指示、我会很乐意追踪这些指示。

    Mike
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我阅读了《PRU 汇编语言工具用户指南》的一个很好的部分、并开始想知道由于内部运行地址相同、如何让链接器分隔存储器区域。 没有说明,但在几个网页上,在一个示例中,它们显示了一个内存{页0:PRUIMEM 或 I_MEM…… 第1页:PRUDMEM 或 D_MEM...} 为什么 PAGE 0指令 RAM 和 PAGE 1数据 RAM? 这是否记录在任何地方? 希望它能为 C6748工作-否则、我必须与 Union 一起聪明一些。 ELF 输出是否知道 C6748加载地址、或者是否必须在链接器命令文件中显式?

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

    这是一个简单的程序、只需从 clpru 链接器中去除代码段即可。 我可以使用调试器将其直接加载到 PRU0上的程序存储器中、并设置控制寄存器中的启用和复位位位位位位、程序运行。 因此、我最初的问题的答案是否定的-无法在 CCS 中执行此操作。 但是、我正在准备完成我的项目、所以这就是所有重要的事情。 希望有一天其他人会发现这很有用。


    秘书长的报告
    * *
    * 此程序从 clpru -z 命令**中读取最终链接的 ELF 文件
    、并去除将加载到 PRU 程序*
    内存中的程序段。 可以在以后创建复杂版本、也可以将*
    **初始化数据加载到 PRU 数据存储器中、但现在忽略该版本。 *
    * *
    * 作者= Mike Rosing *
    * 日期= 2017年2月19日 *
    * *
    ** /#include
    
    
    #include 
    #include 
    #include 
    
    int main (int argc、char * argv[])
    {
    file * PRU、* strp;
    int i、j、k;
    char * flbfr、* flptr;
    ELF32_EHDR * elf;
    ELF32_PHDR * PGM;
    char filename[128]、 *点;
    
    if (argc < 2)
    {
    printf ("使用%s \n"、argv[0]);
    EXIT (0);
    }
    PRU = fopen (argv[1]、"r");
    if (!PRU)
    {
    printf ("找不到文件%s\n"、argv[1]);
    exit(-1);
    }/*
    
    在整个文件中读取。 假设尺寸不是很大。 //
    
    flbfr =(char*) malloc (1024*16);
    i = 0;
    while (!feof (PRU))&&(i < 16*1024)
    {
    flbfr[i]= fgetc (PRU);
    i++;
    }
    elf =(ELF32_EHDR*) flbfr;
    printf ("入口点=%x\n"、elf->e_entry);
    printf ("程序头偏移=%x\n"、elf->e_phoff);
    printf ("入口头大小=%d\n"、elf>e_size
    
    ("elf=%pf-n");程序头文件大小
    =%pf-ngm =%pf-n";(elf_size =%pf-n");(elf_esf=pf-n")
    e_phnum;i++)
    {
    printf ("程序部分%d\n"、i);
    printf ("程序类型=%x\n"、pgm->p_type);
    printf ("程序位置=%x\n"、PGM->p_offset);
    printf ("虚拟地址=%x\n"、pgm->p_vaddr);
    printf ("物理地址=%x\n"、pgm->p_paddr);
    printf ("程序大小=%d\n"、pgM->p_filesz);
    printf ("程序内存大小=%d\n"、pgM->p_memsz);
    printf ("flags =%x\n"、PGM->p_FLAGS);
    printf ("对齐=%d\n"、PGM->p_align);
    printf ("\n");
    PGG++;
    }
    
    /*创建输出文件*/
    
    sprintf (filename、"%s"、argv[1]);
    dot = strstr (filename、".");
    如果(!dot)
    strcat (filename、".prog");
    否则
    sprintf (dot、".prog");
    strp = fopen (fileName、"w");
    if (!strp)
    {
    printf ("无法创建文件%s\n"、文件名);
    EXIT (-2);
    }//*
    
    复位指向第一个程序段的指针*/
    
    PGM =(ELF32_PHRD*)&flbfr[elf->e_phoff];
    for (i=0;i e_phnum;i++)
    {
    if (((PGM->p_type =1)&&(PGM->p_FLAGS & 1))
    {
    // fwrite(&PgM->p_paddr、sizeof (char)、4、strp);
    fwrite(&flbfr[PGM->p_offset]、sizeof (char)、pgM->p_filesz、strp);
    fclose (strp);
    中断;
    }
    Pgm++;
    }
    printf ("检查%s\n"的输出、文件名);
    }