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.

[参考译文] RTOS/PROCESSOR-SDK-AM335X:性能问题

Guru**** 2923960 points

Other Parts Discussed in Thread: SYSBIOS

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/663719/rtos-processor-sdk-am335x-performance-issue

器件型号:PROCESSOR-SDK-AM335X
Thread 中讨论的其他器件:SYSBIOS

工具/软件:TI-RTOS

您好,

我终于从 Linux SDK 更改为 TI-RTOS。 我认为我的代码的工作速度会快很多、但它的工作速度会慢很多。  问题是什么? 我正在使用 EMIF0 SDRAM、也许我应该使用片上存储 器 L3 OCMC0? 它会加快我的代码速度、还是我需要做一些我不熟悉 RTOS 的事情。 我只需要提示、以便我可以继续加速我的程序。 我只想做的是一个简单的 IIR 滤波器、我甚至在 cortex M4上运行它、它的工作速度比在这个 Sitara cortex A8上更快。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    RTOS 团队已收到通知。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    PRU 能够取出部分代码、而当 cortex A8无法运行该代码(用于将 PDM 信号转换为 PCM 的基本 CIC 滤波器)时、所有代码都能正常工作。 如果我没有使用任何优化、在 Linux 上运行正常、我的代码甚至将 buffor 从 kernel 逐个复制到用户空间。 我 真的不知道为什么这个处理器不能在 TI-RTOS 上实时运行基本的4阶 IIR。 在 Linux 上可以正常工作、但有一个问题、信号 显示时间晚了2秒、但我可以注册该信号。 现在、我失去了 buffors、一切都是放慢速度的方式。

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

    这是我的程序中的代码。 我有2个 HWI 中断、每个中断处理扩散 buffor。 中断每15ms 运行一次。 一次针对 buffor0_Handler、然后针对 buffor1_Handler。 我认为这不是太多代码可用于1GHz Cortex A8处理器、但它仍然无法在15ms 内执行中断代码。 使用 Linux SDK 时一切都很好。

    空 buffor0_Handler (UArg0)

    PRUICSS_pruClearEvent (handle、18);
    int * buffor_ptr = buffor0_start + 3;
    UART_printf ("Buffor 0 \n");
    int j = 0;
    for (;j<4000;j++)

    *(iir1 + 2)=*(iir1 + 1);
    *(iir1 + 1)=*(iir1);
    *iir1 =*buffor_ptr;

    *(iir1 + 3)=(*(iir1)* coeff [0]+*(iir1 + 1)* coeff [1]+*(iir1 + 2)* coeff [2]+*(iir1 + 4)* coeff [3]+*(iir1 + 5)* coeff [4])/32768;

    for (int q = 1;q < 4;q++)

    *(iir1 + 3 + q * 3)= (*(iir1 + q * 3)* coeff [0 + q * 5]+*(iir1 + 1 + q * 3)* coeff [1 + q * 5]+*(iir1 + 2 + q * 3)* coeff [2 + q * 5]+*(iir1 + q * 3) coeff +* 5 + iirq +* 5 +* 3 q * 3)* coeff[4 + q * 5])/32768;

    *(iir1 + 5 +(q-1)* 3)=*(iir1 + 4 +(q-1)* 3);
    *(iir1 + 4 +(q-1)* 3)=*(iir1+ 3 +(q-1)* 3);

    *(iir1 + 14)=*(iir1 + 13);
    *(iir1 + 13)=*(iir1 + 12);

    buffor_ptR++;


    /**(iir1 + j)=* coeff ** buffor_ptr +*(coeff + 1)*(buffor_ptr - 1)+*(coeff + 2)*(buffor_ptr - 2)+*(coeff + 3)**(iir1 + j - 1)+*(coeff + 2)*(ieff + 2)*+ 1 *(iireff + 1)*+ 1)*(iireff + 1)*+ 1
    *(iir2 + j)=*(coeff + 5)**(iir1 + j)+*(coeff + 6)*(iir1 + j - 1)+*(coeff + 7)**(iir1 + j - 2)+*(coeff + 8)*(iir2 + j + 2)*(iir2)+ iir2 +*(iir2)+ iir2 + iirj +++ iir9)*(iir2)*(iirj + iir2)
    *(iir3 + j)=*(coeff + 10)**(iir2 + j)+*(coeff + 11)*(iir2 + j - 1)+*(coeff + 12)*(iir2 + j - 2)+*(coff + 13)*(iir3 + j - 1)+ 14)+(coff +)* **(iir3 + j - 2);
    *(iir4 + j)=*(coeff + 15)**(iir3 + j)+*(coeff + 16)*(iir3 + j - 1)+*(coeff + 17)*(iir3 + j - 2)+*(coff + 18)*(iir4 + j - 1)+ 19)+(coff + 19) **(iir4 + j - 2);*/

    //PRUICSS_pruSendEvent (handle、54);

    void buffor1_Handler (UArg0)

    PRUICSS_pruClearEvent (handle、19);
    int j = 0;
    int * buffor_ptr = buffor1_start + 3;
    for (;j<4000;j++)

    *(iir1 + 2)=*(iir1 + 1);
    *(iir1 + 1)=*(iir1);
    *iir1 =*buffor_ptr;

    *(iir1 + 3)=(*(iir1)* coeff [0]+*(iir1 + 1)* coeff [1]+*(iir1 + 2)* coeff [2]+*(iir1 + 4)* coeff [3]+*(iir1 + 5)* coeff [4])/32768;

    for (int q = 1;q < 4;q++)

    *(iir1 + 3 + q * 3)= (*(iir1 + q * 3)* coeff [0 + q * 5]+*(iir1 + 1 + q * 3)* coeff [1 + q * 5]+*(iir1 + 2 + q * 3)* coeff [2 + q * 5]+*(iir1 + q * 3) coeff +* 5 + iirq +* 5 +* 3 q * 3)* coeff[4 + q * 5])/32768;

    *(iir1 + 5 +(q-1)* 3)=*(iir1 + 4 +(q-1)* 3);
    *(iir1 + 4 +(q-1)* 3)=*(iir1+ 3 +(q-1)* 3);

    *(iir1 + 14)=*(iir1 + 13);
    *(iir1 + 13)=*(iir1 + 12);
    buffor_ptR++;


    UART_printf ("Buffor 1 \n");
    //uart_printf ("%d、%d、%d、%d \n"*(buffor0_start)、*(buffor0_start + 1)、*(buffor0_start + 2)、*(buffor0_start + 3));

    // PRUICSS_pruSendEvent (handle、54);

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

    /*========================= 常规配置=================== *


    VAR 默认值= xdc.useModule('xdc.runtime.Defaults');
    VAR 诊断= xdc.useModule('xdc.runtime.Diags');
    VAR 错误= xdc.useModule('xdc.runtime.Error');
    VAR Main = xdc.useModule('xdc.runtime.Main');
    VAR 内存= xdc.useModule('xdc.runtime.Memory')
    VAR SysMin = xdc.useModule('xdc.runtime.SysMin');
    VAR 系统= xdc.useModule('xdc.runtime.System');
    var text = xdc.useModule('xdc.runtime.Text');
    VAR 时钟= xdc.useModule('ti.sysbios.knl.Clock');
    VAR 信标= xdc.useModule('ti.sysbios.knl.Semaphore');
    VAR HeapMem = xdc.useModule('ti.sysbios.heaps.HeapMem');
    VAR SemihostSupport = xdc.useModule('ti.sysbios.rts.gnu.SemiHostSupport');
    VAR 空闲= xdc.useModule('ti.sysbios.knl.Idle');
    VAR 计时器= xdc.useModule('ti.sysbios.hal.Timer');
    VAR Swi = xdc.useModule('ti.sysbios.knl.Swi');
    VAR 任务= xdc.useModule('ti.sysbios.knl.Task');
    VAR 日志= xdc.useModule('xdc.runtime.Log');
    VAR LoggerBuf = xdc.useModule('xdc.runtime.LoggerBuf');
    var ti_SYSBIOS_family_ARM_A8_intcps_Hwi = xdc.useModule('ti.sysbios.family.arm.a8.intcps.Hwi');
    var ti_sysbios_hal_Cache = xdc.useModule('ti.sysbios.hal.Cache');
    /*
    * Program.argSize 设置.args 段的大小。
    *示例不使用命令行参数,因此 argSize 设置为0。
    *
    program.argSize = 0x0;

    /*系统堆栈大小(由 ISR 和 Swi 使用)*/
    program.stack = 0x4000;

    /*
    *取消注释此行以全局禁用断言。
    *所有模块继承'库'模块的默认值。 您
    *可以使用 Module.common$按模块覆盖这些默认值。
    *禁用断言将节省代码空间并提高运行时性能。
    Defaults.common$.diags_ASSERT = Diags.always_off;
    *
    Defaults.common$.diags_ASSERT = Diags.always_off;


    /*
    *取消注释此行以防止模块名称加载到目标上。
    *模块名称字符串放置在.const 段中。 设置此值
    *将参数设置为 false 将节省.const 段中的空间。 误差和
    *断言消息将包含"未知模块"前缀
    实际模块名称的*。
    Defaults.common$.namedModule = false;
    *
    Defaults.common$.namedModule = false;

    /*
    *最小化系统中的 EXIT 处理程序数组。 系统模块包括
    *向 System_atexit()注册的函数数数组
    *由 System_exit()调用。
    *
    System.maxAtexitHandlers = 4;

    /*
    *取消注释此行以禁用错误打印功能。
    *禁用此功能时,我们会丢失错误信息,因为错误是这样
    *未打印。 如果禁用 raiseHook、则会节省一些代码空间
    *由于 Error_print()函数,您的应用程序未使用 System_printf()
    *调用 System_printf()。
    error.raiseHook =空;
    *
    error.raiseHook =空;

    /*
    *取消注释此行以防止 Error、Assert 和 Log 字符串成为字符串
    *加载到目标上。 这些字符串放置在.const 段中。
    *将此参数设置为 false 将节省.const 段中的空间。
    *错误、断言和日志消息将打印原始 ID 和 args 而不是
    *格式化的邮件。
    text.isLoaded = false;
    *
    text.isLoaded = true;

    /*
    *取消注释此行以禁用 SysMin 的字符输出
    *程序退出时。 SysMin 向循环缓冲区写入字符。
    *可以使用 ROV 中的 SysMin Output 视图查看该缓冲器。
    *
    SysMin。flushAtExit = false;

    System_printf()的/*循环缓冲区大小*/
    SYSMIN.bufSize = 128;
    /*
    *为整个系统创建并安装记录器
    *
    var logerBufParams = new LoggerBuf.Params();
    LoggerBufParams.numEntry = 4;
    var logger0 = LoggerBuf.create (logerBufParams);
    Defaults.common$.logger = logger0;
    Main.common$.diags_INFO = Diags.always_on;
    /*
    *为整个系统创建并安装记录器
    *
    System.SupportProxy = SysMin;

    /*========================= BIOS 配置=================== *
    VAR BIOS = xdc.useModule('ti.sysbios.BIOS');
    BIOS.libType = BIOS.LibType_Custom;
    bios.customCCOpts = bios.customCCopts.replace("-g "、"");
    BIOS.sertsEnabled = false;
    BIOS.logsEnabled = false;
    BIOS.swiEnabled = false;

    /*
    * BIOS 模块将为系统创建默认堆。
    *指定此默认堆的大小。
    *
    BIOS.heapSize = 32000;
    Program.sectionsExclude ="..*";

    clock.tickPeriod = 1000000;

    /*========================= 驱动程序配置=================== *
    VAR socType ="AM335x";
    /*加载 OSAL 封装*/
    var osType ="tirtos"
    VAR OSAL = xdc.useModule('ti.osal.Settings');
    OSAL.osType = osType;
    OSAL.socType = socType;

    /*使用 CSL 封装*/

    VAR_l = XDC.loadPackage ('ti.CSL');
    Csl.Settings.deviceType = socType;

    /*加载 UART 软件包*/
    VAR UartPackage = XDC.loadPackage ('ti.drv.UART');

    /*加载 I2C 封装*/
    var I2C = xdc.loadPackage ('ti.drv.i2c');

    /*加载电路板封装*/
    VAR 板= XDC.loadPackage ('ti.board');
    board.Settings.boardName ="bbbAM335x";

    /*加载性能评测软件包*/
    VAR Utils = XDC.loadPackage ('ti.utils.profiling');

    /*加载 GPIO 包*/
    VAR GpioPackage = XDC.loadPackage ('ti.drv.GPIO');
    GpioPackage.Settings.enableProfiling = true;


    VAR Prusss = XDC.loadPackage ('ti.drv.pruss');
    Pruss.Settings.socType = socType;

    /*========================= 高速缓存和 MMU 配置=================== *

    VAR Cache = xdc.useModule('ti.sysbios.family.arm.a8.Cache');
    cache.enableCache = true;

    VAR MMU = xdc.useModule('ti.sysbios.family.arm.a8.Mmu');
    MM4.enableMMU = true;

    /*强制外设部分为不可高速缓存的严格排序存储器*/
    VAR 外设 Attrs ={
    键入:MMU.FirstLevelDesc_section,//段描述符
    TEX:0、
    可缓冲:false, //可缓冲
    可高速缓冲:false, //可缓存
    可共享:true, //可共享
    NoExecute:true, //不可执行
    };

    /*定义外设所在的1Meg 页的基址。 *
    VAR 外设 BaseAddr = 0x44e00400;;

    /*相应地配置相应的 MMU 页描述符*/
    Mmu.setFirstLevelDescMeta(peripheralBaseAddr、
    peripheralBaseAddr、
    peripheralAttrs);


    /*定义外设所在的1Meg 页的基址。 *
    VAR 外设 BaseAddr = 0x481a6000;

    /*相应地配置相应的 MMU 页描述符*/
    Mmu.setFirstLevelDescMeta(peripheralBaseAddr、
    peripheralBaseAddr、
    peripheralAttrs);

    /*定义外设所在的1Meg 页的基址。 *
    VAR 外设 BaseAddr = 0x4a300000;

    /*相应地配置相应的 MMU 页描述符*/
    Mmu.setFirstLevelDescMeta(peripheralBaseAddr、
    peripheralBaseAddr、
    peripheralAttrs);
    /*定义外设所在的1Meg 页的基址。 *
    VAR 外设 BaseAddr = 0x40300000;

    /*相应地配置相应的 MMU 页描述符*/
    Mmu.setFirstLevelDescMeta(peripheralBaseAddr、
    peripheralBaseAddr、
    peripheralAttrs);

    //表示 Cortex-A8
    VAR Cache = xdc.useModule('ti.sysbios.family.arm.a8.Cache');

    VAR MMU = xdc.useModule('ti.sysbios.family.arm.a8.Mmu');

    //启用高速缓存
    cache.enableCache = true;

    //启用 MMU (L1/L2数据缓存所需)
    MM4.enableMMU = true;

    //用于标记存储器区域的描述符属性结构
    //作为正常的可高速缓存存储器(回写和写分配)
    VAR attrs ={
    键入:MMU。FirstLevelDesc_section、//段描述符
    TEX:0x1、
    可缓冲:真、 //可缓冲
    可高速缓存:true、 //可缓存
    可共享:true,
    };

    //为地址范围中的每个条目设置描述符
    对于(var i=0x80000000;i < 0x90000000;i = i + 0x00100000){
    //每个“描述符”条目跨越1MB 地址范围
    Mmu.setFirstLevelDescMeta(i、i、attrs);


    var memmap = Program.cpu.memyMap;
    VAR DDR =空;

    //在内存映射中查找 DDR
    对于(var i=0;i < memmap.length;i++){
    if (memmap[i].name ="DDR"){
    DDR = memmap[i];



    //将 MMU 表放在 DDR 内存段中(如果存在)
    if (DDR!= null){
    VAR sectionName ="ti.sysbios.family.arm.a8.mutableSection";
    Program.sectMap[sectionName]= new Program.SectionSpec ();
    Program.sectMap[sectionName].type ="NoLoad";//适用于 TI 工具的 NOINIT
    Program.sectMap[sectionName].loadSegment ="DDR";

    否则{
    print ("未找到 DDR 内存段");


    VAR task0Params = new Task.Params();
    task0Params.instance.name ="空";
    VAR task0 = Task.create ("&taskInitPRUFxn"、task0Params);

    var ti_sysbios_family_arm_a8_intcps_Hwi0Params = new ti_sysbios_family_arm_A8_intcps_Hwi.Params ();
    ti_sysbios_family_arm_a8_intcps_Hwi0Params.instance.name ="buffor0";
    TI_SYSBIOS_family_ARM_A8_intcps_Hw0Params.type = ti_SYSBIOS_family_ARM_A8_intcps_Hwi.Type_IRQ;
    program.global.buffor0 = ti_SYSBIOS_family_ARM_A8_intcps_Hwi.create (20、"&buffor0_Handler"、ti_SYSBIOS_family_ARM_A8_intcps_Hwi0Params);

    Mmu.defaultAttrs.accPerm = 3;
    Mmu.defaultAttrs.shareable = true;

    var ti_sysbios_family_arm_a8_intcps_Hwi1Params = new ti_sysbios_family_arm_A8_intcps_Hwi.Params ();
    ti_sysbios_family_arm_a8_intcps_Hwi1Params.instance.name ="buffor1";
    TI_SYSBIOS_family_ARM_A8_intcps_Hwi1Params.type = ti_SYSBIOS_family_ARM_A8_intcps_Hwi.Type_IRQ;
    program.global.buffor1 = ti_SYSBIOS_family_ARM_A8_intcps_Hwi.create (22、"&buffor1_Handler"、ti_SYSBIOS_family_ARM_A8_intcps_Hwi1Params);

    bios.cpufreq.lo = 500000000;

    Mmu.defaultAttrs.cacheable = true;

    var heapMem0Params = new HeapMem.Params();
    heapMem0Params.instance.name ="heapMem0";
    heapMem0Params.size = 128000;
    program.global.heapMem0 = HeapMem.create (heapMem0Params);

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

    1)1) ISR 例程中不应存在任何 UART_printf。 Printfs 本身就很慢。
    2) 2)系数/iir1缓冲器位于何处? OCMC RAM? OCMC RAM 在*。cfg 文件中配置为不可高速缓冲和不可缓冲。否则、假设您的设计中具有 DDR、请尝试可高速缓冲和可共享的 DDR。
    3) 3)请提供.map 文件。

    Lali
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    1) 1)好的、我将对其进行更改。
    2) 2)我尝试在 OCMC RAM 上进行测试、在 EMIF0 SDRAM 上、我获得的结果相同、但仍然非常缓慢地工作。 将 OCMC RAM 设置为可缓存和可缓冲将解决性能问题? 我正在使用 BeagleBone Black、它具有512 DDR3、但我不知道存储器地址、我也不知道如何配置您是否有任何教程。
    3) 3)我没有.map 文件、但我从未使用过那个、我能找到它。 您是否有任何站点、我是否可以阅读有关.map 文件的更多信息。 这是什么?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我更改了.cfg 文件、现在 OCM 是可缓存且可缓冲的、但它对穿孔没有帮助、一切工作都非常缓慢。 :/如何添加或使用 DDR?






    /*========================= 常规配置=================== *
    VAR 默认值= xdc.useModule('xdc.runtime.Defaults');
    VAR 诊断= xdc.useModule('xdc.runtime.Diags');
    VAR 错误= xdc.useModule('xdc.runtime.Error');
    VAR Main = xdc.useModule('xdc.runtime.Main');
    VAR 内存= xdc.useModule('xdc.runtime.Memory')
    VAR SysMin = xdc.useModule('xdc.runtime.SysMin');
    VAR 系统= xdc.useModule('xdc.runtime.System');
    var text = xdc.useModule('xdc.runtime.Text');
    VAR 时钟= xdc.useModule('ti.sysbios.knl.Clock');
    VAR 信标= xdc.useModule('ti.sysbios.knl.Semaphore');
    VAR HeapMem = xdc.useModule('ti.sysbios.heaps.HeapMem');
    VAR SemihostSupport = xdc.useModule('ti.sysbios.rts.gnu.SemiHostSupport');
    VAR 空闲= xdc.useModule('ti.sysbios.knl.Idle');
    VAR 计时器= xdc.useModule('ti.sysbios.hal.Timer');
    VAR Swi = xdc.useModule('ti.sysbios.knl.Swi');
    VAR 任务= xdc.useModule('ti.sysbios.knl.Task');
    VAR 日志= xdc.useModule('xdc.runtime.Log');
    VAR LoggerBuf = xdc.useModule('xdc.runtime.LoggerBuf');
    var ti_SYSBIOS_family_ARM_A8_intcps_Hwi = xdc.useModule('ti.sysbios.family.arm.a8.intcps.Hwi');
    var ti_sysbios_hal_Cache = xdc.useModule('ti.sysbios.hal.Cache');
    VAR LoggerCallback = xdc.useModule('xdc.runtime.LoggerCallback');
    VAR LoggerSys = xdc.useModule('xdc.runtime.LoggerSys');
    /*
    * Program.argSize 设置.args 段的大小。
    *示例不使用命令行参数,因此 argSize 设置为0。
    *
    program.argSize = 0x0;

    /*系统堆栈大小(由 ISR 和 Swi 使用)*/
    program.stack = 0x4000;

    /*
    *取消注释此行以全局禁用断言。
    *所有模块继承'库'模块的默认值。 您
    *可以使用 Module.common$按模块覆盖这些默认值。
    *禁用断言将节省代码空间并提高运行时性能。
    Defaults.common$.diags_ASSERT = Diags.always_off;
    *
    Defaults.common$.diags_ASSERT = Diags.always_off;


    /*
    *取消注释此行以防止模块名称加载到目标上。
    *模块名称字符串放置在.const 段中。 设置此值
    *将参数设置为 false 将节省.const 段中的空间。 误差和
    *断言消息将包含"未知模块"前缀
    实际模块名称的*。
    Defaults.common$.namedModule = false;
    *
    Defaults.common$.namedModule = false;

    /*
    *最小化系统中的 EXIT 处理程序数组。 系统模块包括
    *向 System_atexit()注册的函数数数组
    *由 System_exit()调用。
    *
    System.maxAtexitHandlers = 4;

    /*
    *取消注释此行以禁用错误打印功能。
    *禁用此功能时,我们会丢失错误信息,因为错误是这样
    *未打印。 如果禁用 raiseHook、则会节省一些代码空间
    *由于 Error_print()函数,您的应用程序未使用 System_printf()
    *调用 System_printf()。
    error.raiseHook =空;
    *
    error.raiseHook =空;

    /*
    *取消注释此行以防止 Error、Assert 和 Log 字符串成为字符串
    *加载到目标上。 这些字符串放置在.const 段中。
    *将此参数设置为 false 将节省.const 段中的空间。
    *错误、断言和日志消息将打印原始 ID 和 args 而不是
    *格式化的邮件。
    text.isLoaded = false;
    *
    text.isLoaded = true;

    /*
    *取消注释此行以禁用 SysMin 的字符输出
    *程序退出时。 SysMin 向循环缓冲区写入字符。
    *可以使用 ROV 中的 SysMin Output 视图查看该缓冲器。
    *
    SysMin。flushAtExit = true;

    System_printf()的/*循环缓冲区大小*/
    SYSMIN.bufSize = 128;
    /*
    *为整个系统创建并安装记录器
    *
    var logerBufParams = new LoggerBuf.Params();
    LoggerBufParams.numEntry = 4;
    var logger0 = LoggerBuf.create (logerBufParams);
    Defaults.common$.logger = logger0;
    Main.common$.diags_INFO = Diags.always_on;
    /*
    *为整个系统创建并安装记录器
    *
    System.SupportProxy = SysMin;

    /*========================= BIOS 配置=================== *
    VAR BIOS = xdc.useModule('ti.sysbios.BIOS');
    BIOS.libType = BIOS.LibType_Custom;
    bios.customCCOpts = bios.customCCopts.replace("-g "、"");
    BIOS.sertsEnabled = false;
    BIOS.logsEnabled = false;
    BIOS.swiEnabled = false;

    /*
    * BIOS 模块将为系统创建默认堆。
    *指定此默认堆的大小。
    *
    BIOS.heapSize = 32000;
    Program.sectionsExclude ="..*";

    clock.tickPeriod = 1000000;

    /*========================= 驱动程序配置=================== *
    VAR socType ="AM335x";
    /*加载 OSAL 封装*/
    var osType ="tirtos"
    VAR OSAL = xdc.useModule('ti.osal.Settings');
    OSAL.osType = osType;
    OSAL.socType = socType;

    /*使用 CSL 封装*/

    VAR_l = XDC.loadPackage ('ti.CSL');
    Csl.Settings.deviceType = socType;

    /*加载 UART 软件包*/
    VAR UartPackage = XDC.loadPackage ('ti.drv.UART');

    /*加载 I2C 封装*/
    var I2C = xdc.loadPackage ('ti.drv.i2c');

    /*加载电路板封装*/
    VAR 板= XDC.loadPackage ('ti.board');
    board.Settings.boardName ="bbbAM335x";

    /*加载性能评测软件包*/
    VAR Utils = XDC.loadPackage ('ti.utils.profiling');

    /*加载 GPIO 包*/
    VAR GpioPackage = XDC.loadPackage ('ti.drv.GPIO');
    GpioPackage.Settings.enableProfiling = true;


    VAR Prusss = XDC.loadPackage ('ti.drv.pruss');
    Pruss.Settings.socType = socType;

    /*========================= 高速缓存和 MMU 配置=================== *

    VAR Cache = xdc.useModule('ti.sysbios.family.arm.a8.Cache');
    cache.enableCache = true;

    VAR MMU = xdc.useModule('ti.sysbios.family.arm.a8.Mmu');
    MM4.enableMMU = true;

    /*强制外设部分为不可高速缓存的严格排序存储器*/
    VAR 外设 Attrs ={
    键入:MMU.FirstLevelDesc_section,//段描述符
    TEX:0、
    可缓冲:false, //可缓冲
    可高速缓冲:false, //可缓存
    可共享:true, //可共享
    NoExecute:true, //不可执行
    };

    /*定义外设所在的1Meg 页的基址。 *
    VAR 外设 BaseAddr = 0x44e00400;;

    /*相应地配置相应的 MMU 页描述符*/
    Mmu.setFirstLevelDescMeta(peripheralBaseAddr、
    peripheralBaseAddr、
    peripheralAttrs);


    /*定义外设所在的1Meg 页的基址。 *
    VAR 外设 BaseAddr = 0x481a6000;

    /*相应地配置相应的 MMU 页描述符*/
    Mmu.setFirstLevelDescMeta(peripheralBaseAddr、
    peripheralBaseAddr、
    peripheralAttrs);

    /*定义外设所在的1Meg 页的基址。 *
    VAR 外设 BaseAddr = 0x4a300000;

    /*相应地配置相应的 MMU 页描述符*/
    Mmu.setFirstLevelDescMeta(peripheralBaseAddr、
    peripheralBaseAddr、
    peripheralAttrs);



    VAR 外设 Attrs ={
    键入:MMU.FirstLevelDesc_section,//段描述符
    TEX:0x1、
    可缓冲:真, //可缓冲
    可高速缓冲:true, //可缓存
    可共享:true, //可共享

    };


    VAR 外设 BaseAddr = 0x40300000;

    /*相应地配置相应的 MMU 页描述符*/
    Mmu.setFirstLevelDescMeta(peripheralBaseAddr、
    peripheralBaseAddr、
    peripheralAttrs);


    VAR attrs ={
    键入:MMU。FirstLevelDesc_section、//段描述符
    TEX:0x1、
    可缓冲:真、 //可缓冲
    可高速缓存:true、//可高速缓存
    可共享:true
    };

    //为地址范围中的每个条目设置描述符
    对于(var i=0x80000000;i < 0x90000000;i = i + 0x00100000){
    //每个“描述符”条目跨越1MB 地址范围
    Mmu.setFirstLevelDescMeta(i、i、attrs);


    var memmap = Program.cpu.memyMap;
    VAR DDR =空;

    //在内存映射中查找 DDR
    对于(var i=0;i < memmap.length;i++){
    if (memmap[i].name ="DDR"){
    DDR = memmap[i];



    //将 MMU 表放在 DDR 内存段中(如果存在)
    if (DDR!= null){
    VAR sectionName ="ti.sysbios.family.arm.a8.mutableSection";
    Program.sectMap[sectionName]= new Program.SectionSpec ();
    Program.sectMap[sectionName].type ="NoLoad";//适用于 TI 工具的 NOINIT
    Program.sectMap[sectionName].loadSegment ="DDR";

    否则{
    print ("未找到 DDR 内存段");


    VAR task0Params = new Task.Params();
    task0Params.instance.name ="空";
    task0Params.priority = 1;
    VAR task0 = Task.create ("&taskInitPRUFxn"、task0Params);

    var ti_sysbios_family_arm_a8_intcps_Hwi0Params = new ti_sysbios_family_arm_A8_intcps_Hwi.Params ();
    ti_sysbios_family_arm_a8_intcps_Hwi0Params.instance.name ="buffor0";
    TI_SYSBIOS_family_ARM_A8_intcps_Hw0Params.type = ti_SYSBIOS_family_ARM_A8_intcps_Hwi.Type_IRQ;
    program.global.buffor0 = ti_SYSBIOS_family_ARM_A8_intcps_Hwi.create (20、"&buffor0_Handler"、ti_SYSBIOS_family_ARM_A8_intcps_Hwi0Params);


    var ti_sysbios_family_arm_a8_intcps_Hwi1Params = new ti_sysbios_family_arm_A8_intcps_Hwi.Params ();
    ti_sysbios_family_arm_a8_intcps_Hwi1Params.instance.name ="buffor1";
    TI_SYSBIOS_family_ARM_A8_intcps_Hwi1Params.type = ti_SYSBIOS_family_ARM_A8_intcps_Hwi.Type_IRQ;
    program.global.buffor1 = ti_SYSBIOS_family_ARM_A8_intcps_Hwi.create (22、"&buffor1_Handler"、ti_SYSBIOS_family_ARM_A8_intcps_Hwi1Params);

    bios.cpufreq.lo = 500000000;


    var heapMem0Params = new HeapMem.Params();
    heapMem0Params.instance.name ="heapMem0";
    heapMem0Params.size = 128000;
    program.global.heapMem0 = HeapMem.create (heapMem0Params);

    clock.tickMode = Clock.tickMode_dynamic;
    clock.tickSource = Clock.tickSource_NULL;

    Mmu.defaultAttrs.type = MMU。FirstLevelDesc_SECTION;
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我恢复 Linux 的所有工作都非常快、但我有一些问题需要使用 TI-RTOS 来解决、但这里的 cortex A8无法及时计算基本的数据
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的、我解决了我的问题、解决方案是清理*。cfg 我删除了此代码以响应数据存储器部分。 加速。 有人能不能告诉我为什么 MMU 减慢了我的 CPU 的速度、这是什么问题。 我是否可以阅读有关 MMU 的更多信息?  

    VAR 外设 BaseAddr = 0x40300000;

    /*相应地配置相应的 MMU 页描述符*/
    Mmu.setFirstLevelDescMeta(peripheralBaseAddr、
    peripheralBaseAddr、
    peripheralAttrs);


    VAR attrs ={
    键入:MMU。FirstLevelDesc_section、//段描述符
    TEX:0x1、
    可缓冲:真、//可缓冲
    可高速缓存:true、//可高速缓存
    可共享:true  
    };

    //为地址范围中的每个条目设置描述符
    对于(var i=0x80000000;i < 0x90000000;i = i + 0x00100000){
    //每个“描述符”条目跨越1MB 地址范围
    Mmu.setFirstLevelDescMeta(i、i、attrs);


    var memmap = Program.cpu.memyMap;
    VAR DDR =空;

    //在内存映射中查找 DDR
    对于(var i=0;i < memmap.length;i++){
    if (memmap[i].name ="DDR"){
    DDR = memmap[i];



    //将 MMU 表放在 DDR 内存段中(如果存在)
    if (DDR!= null){
    VAR sectionName ="ti.sysbios.family.arm.a8.mutableSection"
    Program.sectMap[sectionName]= new Program.SectionSpec ();
    Program.sectMap[sectionName].type ="NoLoad";//适用于 TI 工具的 NOINIT
    Program.sectMap[sectionName].loadSegment ="DDR";

    否则{
    print ("未找到 DDR 内存段");

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

    缓冲区存储在何处、OCMC 或 DDR?

    为了帮助进一步缩小范围、引入 OCMC MMU 配置并检查性能是否保持不变。 如果性能保持不变、则表示数据未存储在 OCMC 中。

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

    OCMC 内存问题不好。我认为 EMIF0 SDRAM 的 MMU 设置错误。我删除了*。cfg 文件中存储器部分的所有设置、所有设置都加快了速度、现在可以正常工作。