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:GPIO HWI 问题

Guru**** 2609945 points
Other Parts Discussed in Thread: SYSBIOS, AM3359

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/654256/rtos-processor-sdk-am335x-gpio-hwi-issue

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

工具/软件:TI-RTOS

您好!

我正在尝试为 GPIO1创建一个 HWI。 我浪费了2天、但没有让它正常工作、也没有退房的示例。 这是我的代码:

int main()

board_initCfg boardCfg;
boardCfg = Board_init_PINMUX_CONFIG |
Board_init_module_clock |
Board_init_uart_stdio;

board_init (boardCfg);
GPIO_init();

GPIO_WRITE ((USER_LED1)、GPIO_PIN_VAL_HIGH);

Hwi_Params HwiParams;

Hwi_handle myHwi;
ERROR_Block EB;

ERROR_INIT (&EB);
Hwi_Params_init (hwiParams);

hwiParams.arg = 0;
hwiParams.enableInt = false;
hwiParams.EventID = 98;//<--- EventID 是 AM335x 手册(www.ti.com/.../spruh73p.pdf)中的 int 编号   
myHwi = Hwi_create (98、myIsr、&hwiParams、&EB);//<--- 还是将 int 编号作为中断编号放置在这里。 当我观看 TI RTOS 车间散射架构 在初始化该帕雷米时有扩散途径
//剂量 ISR 函数必须进行特殊命名,或者我可以用我想要的方式命名它?

if (myHwi = NULL){
system_abort ("Hwi 创建失败");

Hwi_enable();
Hwi_enableInterrupt (5);

BIOS_start();/*不返回*/
返回(0);



当我在 Hwi_create (98、myIsr、&hwiParams、&EB)中使用中断号98并对其进行调试时、程序崩溃并得到错误:

"no source available for "Do_AngelSWI (int、void *)[C:/Users\ox areny VR\workspace_v7\LEDBIOS\Debug\LEDBIOS.out] at 0x8000d854"(没有可用于"do_AngelSWI (int、void *)的源文件)"

和  

CortxA8:未处理的 ADP_Stopped 异常0x20023

是否有人知道如何修复这个错误并创建一个 Hwi、因为我不知道如何执行这个操作。  

Rafal

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

    好的、我开始使用 PDK 示例"GPIO_LedBlink_bbbAM335x_armTestProject"我可以通过将回调函数设置为中断来使 LED 闪烁、但当我创建一个 Hwi 中断来运行传递给回调函数的函数时、它将不起作用。 我将通过 GPIOTriggerPinInt()触发中断;与示例中的情况相同。 但它不会触发 Hwi。 为什么我尝试通过 Hwi_post 触发 Hwi、一切都正常。 我不知道我做了什么错误以及为什么 GPIOTriggerPinInt ();dosent 触发 Hwi 中断。 我发布我的代码(包含已编码片段的 expamle):

    主:
    #ifndef bare_metal

    /* XDCtools 头文件*/
    #include
    #include
    #include
    #include


    /* BIOS 头文件*/
    #include
    #include
    #endif

    #include

    /* TI-RTOS 头文件*/
    #include
    #include

    #include "GPIO_log.h"
    #include "gpio_board.h"

    #include

    /********
    秘书长的报告 宏命令
    (二 /
    #if defined (SOC_AM574x)|| Defined (SOC_AM572x)|| Defined (SOC_AM571x)
    #if 已定义(_TI_ARM_V7M4__)
    #define DELAY_VALUE (0x6FFFFFU)/*更新延迟、因为它不足以满足 M4内核的要求*/
    其他
    #define DELAY_VALUE (0x6FFFFFU)
    #endif
    其他
    #define DELAY_VALUE (0x6FFFFFU)
    #endif

    /********
    秘书长的报告 内部功能
    (二 /

    /*延迟功能*/
    void AppDelay (unsigned int delayVal);

    /*回调函数*/
    void AppGpioCallbackFxn (UArg0);

    #if defined (idkAM574x)|| defined (idkAM572x)|| defined (idkAM571x)(IDkAM571x)(已定义)
    /* GPIO 时钟和引脚多路复用配置*/
    extern void AppGPIOInit (void);
    #endif

    #if defined (idkAM574x)|| defined (idkAM572x)(IDkAM572x)(如已定义)
    extern void GPIOApp_UpdateBoardInfo (void);
    extern void GPIOAppUpdateConfig (uint32_t * gpioBaseAddr、uint32_t * gpioPin);
    #endif

    /*
    *==== Board_initI2C ===
    *
    静态空 Board_initGPIO (空)

    board_initCfg boardCfg;

    #if defined (SOC_K2H)|| Defined (SOC_K2K)|| Defined (SOC_K2E)|| Defined (SOC_K2L)|| Defined (SOC_K2G)|| Defined (SOC_C6678)|| Defined (SOC_C6657)|| Defined (SOC_OMAPL137)|| Defined (SOC_OMAPL138)
    GPIO_V0_HwAttrs GPIO_cfg;

    /*获取默认的 SPI 初始化配置*/
    GPIO_socGetInitCfg (GPIO_LED0_PORT_NUM、&GPIO_cfg);

    /*如有必要,修改默认 GPIO 配置*/

    /*设置默认的 GPIO 初始化配置*/
    GPIO_socSetInitCfg (GPIO_LED0_PORT_NUM、&GPIO_cfg);

    #IF 定义(SOC_K2G)
    /*设置 GPIO 中断配置*/
    GPIO_socSetIntMux (GPIO_LED0_PORT_NUM、GPIO_LED0_PIN_NUM、NULL、GPIO_MUX_SEL);
    #endif
    #IF 定义(SOC_OMAPL137)||定义(SOC_OMAPL138)
    /*设置 GPIO 中断配置*/
    GPIO_socSetBankInt (GPIO_LED0_PORT_NUM、GPIO_LED0_PIN_NUM、NULL);
    #endif
    #endif

    #if defined (evmK2E)|| defined (evmC6678)(如果已定义、则为 evmK2E)
    boardCfg = Board_init_module_clock |
    Board_init_uart_stdio;
    其他
    boardCfg = Board_init_PINMUX_CONFIG |
    Board_init_module_clock |
    Board_init_uart_stdio;
    #endif
    board_init (boardCfg);

    #if defined (idkAM572x)|| defined (idkAM574x)(IDkAM572x)(如已定义)
    GPIOApp_UpdateBoardInfo();
    #endif

    /********
    秘书长的报告 全局变量*********
    (二 /
    volatile uint32_t GPIO_intr_triggered = 0;
    uint32_t gpioBaseAddr;
    uint32_t gpioPin;

    /*
    *==== 测试函数====
    *
    #ifndef bare_metal
    空 GPIO_TEST (UARg arg0、UARg arg1)

    其他
    void main()

    Board_initGPIO();
    #endif
    uint32_t TestOutput = 1;

    /* GPIO 初始化*/
    GPIO_init();

    /*设置回调函数*/
    // GPIO_setCallback (USER_LED0、AppGpioCallbackFxn);

    /*在特定 GPIO 引脚上启用 GPIO 中断*/
    GPIO_enableInt (USER_LED0);//<-我必须为 Hwi 启用 Int 吗?

    /*将高电平写入 GPIO 引脚以控制 LED1 */
    GPIO_WRITE ((USER_LED1)、GPIO_PIN_VAL_HIGH);
    AppDelay (delay_value);

    GPIO_log ("\n GPIO LED 闪烁应用程序\n");

    #if defined (SOC_K2L)|| Defined (SOC_C6678)|| Defined (SOC_C6657)
    //没有 GPIO 引脚直接连接到 K2L/K2G/C6678/C6657 EVM 上的用户 LED,只需触发一次中断*/
    GPIO_TOGGLE (USER_LED0);
    while (!GPIO_intr 触发);

    GPIO_log ("\n 所有测试都通过了\n");
    其他

    while (1)

    #if defined (SOC_AM574x)|| defined (SOC_AM572x)|| Defined (SOC_AM571x)|| Defined (SOC_AM335x)|| Defined (SOC_AM437x)

    #IF 定义(idkAM572x)||定义(idkAM574x)
    /*根据主板更新 GPIO 信息*/
    GPIOAppUpdateConfig (gpioBaseAddr、gpioPin);
    其他
    gpioBaseAddr = SOC_GPIO_2_regs;
    GpioPin = 3;
    #endif
    /*触发中断*/
    GPIOTriggerPinInt (gpioBaseAddr、0、gpioPin);<-这不影响 Hwi 中断
    //Hwi_post (32);<-这个触发我的 Hwi 中断  
    #endif
    #if defined (SOC_K2H)|| defined (SOC_K2K)|| Defined (SOC_K2E)|| Defined (SOC_K2G)|| Defined (SOC_OMAPL137)|| Defined (SOC_OMAPL138)
    GPIO_TOGGLE (USER_LED0);
    #endif
    AppDelay (delay_value);
    IF (测试输出)

    GPIO_log ("\n 所有测试都通过了\n");
    TestOutput = 0;


    #endif
    Task_exit();

    #ifndef bare_metal
    /*
    *==== main ====
    *
    int main (空)

    /*呼叫板初始化函数*/
    Board_initGPIO();

    #if defined (idkAM574x)|| defined (idkAM572x)|| defined (idkAM571x)(IDkAM571x)(已定义)
    AppGPIOInit();
    #endif

    /*启动 BIOS */
    BIOS_start();
    返回(0);

    #endif

    /*
    *==== AppDelay =====
    *
    void AppDelay (unsigned int delayVal)

    while (delayVal)

    DelayVal---;

    /*
    *==== 回调函数====
    *
    void AppGpioCallbackFxn (UArg0)

    /*切换 LED1 */
    GPIO_TOGGLE (USER_LED1);

    AppDelay (delay_value);
    GPIO_intR_triggered = 1;

    ------------------------------------------------------------------

    GPIO_board_config_file:

    #include
    #include
    #include

    #define GPIO_USER0_LED_PIN_NUM (0x03)
    #define GPIO_USER0_LED_PORT_NUM (0x02)
    #define GPIO_User1_LED_PIN_NUM (0x17)
    #define GPIO_User1_LED_PORT_NUM (0x02)


    /* GPIO 驱动器板特定引脚配置结构*/
    GPIO_PinConfig gpioPinConfigs[]={
    /*启用中断的输入引脚:用户 LED */
    GPIO_DEVICE_CONFIG ((GPIO_USER0_LED_PORT_NUM)、GPIO_USER0_LED_PIN_NUM)|
    GPIO_CFG_IN_INT_INT_RISING | GPIO_CFG_INPUT、

    /*输出引脚:用户 LED */
    GPIO_DEVICE_CONFIG ((GPIO_User1_LED_PORT_NUM)、GPIO_User1_LED_PIN_NUM)|
    GPIO_CFG_OUTPUT
    };

    /* GPIO 驱动程序回调函数*/
    GPIO_CallbackFxn gpioCallbackFunctions[]={
    null、
    null
    };

    /* GPIO 驱动程序配置结构*/
    GPIO_v1_Config GPIO_v1_config ={
    gpioPinConfigs、
    GpioCallbackFunctions、
    sizeof (gpioPinConfigs)/sizeof (GPIO_PinConfig)、
    sizeof (gpioCallbackFunctions)/ sizeof (GPIO_CallbackFxn)、
    0x1U、
    };
    ------------------------------------------------------
    和我的 HWI 脚本配置:

    var hwi0Params = new hwi.Params();
    hwi0Params.instance.name ="hwi0";
    hwi0Params.EventID = 32;<-我仍然不知道我是否在这里放置 int 编号
    hwi0Params.enableInt = true;
    program.global.hwi0 = Hwi.create (32、"&AppGpioCallbackFxn"、hwi0Params);<-或者我在这里执行它、32是 GPIO2A 中断线路2


    由于我不知道为什么板不想听我的讲话、因此 PLI 很有帮助。 我有 BeagleBoard x-15 I'a、想知道它是否与 TI-RTOS 更兼容。 您认为我应该将电路板上的焊盘槽布板更换为 BeagleBoard x-15吗?

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

    现在我创建了更基本的程序。 我有一个只有 system_printft 的空闲函数和一个 delay 函数、一个位于基本 min SYS/BIOS 默认项目中的任务我只添加了一个 Hwi_post ()、而我有一个 Hwi 函数 system_printf ();这就是全部。 问题是当我布置 Hwi 函数时、它开始无限执行它。 在讨论 TI-RTOS 实验课程后、我确定它应该只运行一次、然后在 while 循环中运行空闲函数。 TI-RTOS 的问题在于它与 AM335x 和 BeagleBone-Black 不兼容、或者我想不理解它。 我发布我的主代码。

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

    #include

    #include

    #include

    #include

    #include
    #define DELAY_VALUE (0x6FFFFFU)
    /*
    *==== taskFxn ====
    *
    void AppDelay (unsigned int delayVal)

    while (delayVal)

    DelayVal---;


    void myHwiFxn (UArg 参数)

    Hwi_clearInterrupt (5);
    System_printf ("Hwi_interrupt!\n");
    AppDelay (delay_value);
    AppDelay (delay_value);
    AppDelay (delay_value);
    AppDelay (delay_value);

    空 idleFxn()

    system_printf ("idled!\n");
    AppDelay (delay_value);
    AppDelay (delay_value);
    AppDelay (delay_value);
    AppDelay (delay_value);

    void taskFxn (UARg a0、UARg A1)

    system_printf ("enter taskFxn ()\n");

    Task_sleep (10);
    Hwi_post (5);
    system_printf ("exit taskFxn ()\n"\});

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

    /*
    *使用 ROV->SysMin 查看循环缓冲区中的字符
    *
    system_printf ("enter main()\n");

    BIOS_start();/*不返回*/
    返回(0);




    --------------------------------------------------------------------

    我的 app.cfg

    VAR 默认值= xdc.useModule('xdc.runtime.Defaults');
    VAR 诊断= xdc.useModule('xdc.runtime.Diags');
    VAR 错误= xdc.useModule('xdc.runtime.Error');
    VAR 日志= xdc.useModule('xdc.runtime.Log');
    VAR LoggerBuf = xdc.useModule('xdc.runtime.LoggerBuf');
    VAR Main = xdc.useModule('xdc.runtime.Main');
    VAR SysMin = xdc.useModule('xdc.runtime.SysMin');
    VAR 系统= xdc.useModule('xdc.runtime.System');
    var text = xdc.useModule('xdc.runtime.Text');

    VAR BIOS = xdc.useModule('ti.sysbios.BIOS');
    VAR Hwi = xdc.useModule('ti.sysbios.hal.Hwi');
    VAR 任务= xdc.useModule('ti.sysbios.knl.Task');
    VAR 空闲= xdc.useModule('ti.sysbios.knl.Idle');

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

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

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

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

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

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

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

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

    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 库。 自定义库将小于
    *预构建的"已检测"(默认)和"未检测"库。
    *
    * BIOS.logsEnabled 参数指定是否启用日志记录
    *在 BIOS 中执行此自定义构建。 RTA 和使用了这些日志
    * UIA 分析工具。
    *
    * BIOS.sertsEnabled 参数指定 BIOS 代码是否会
    * include assert()检查。 将此参数设置为"false"将生成
    *建议使用更小、更快的代码、但启用断言
    *早期开发过程中的 assert()检查将捕获大量编程
    *错误(无效参数等)
    *
    BIOS.libType = BIOS.LibType_Custom;
    BIOS.logsEnabled = false;
    BIOS.sertsEnabled = true;

    /*
    *创建任务。 'taskFxn'函数可在 main.c 中找到
    *
    VAR task0Params = new Task.Params();
    VAR task0 = Task.create ("&taskFxn"、task0Params);
    idleFxns[0]="&idleFxn";
    var hwi0Params = new hwi.Params();
    hwi0Params.instance.name ="hwi0";
    hwi0Params.arg = 0;
    hwi0Params.priority = 1;
    hwi0Params.EventID = 5;
    program.global.hwi0 = Hwi.create (5、"&myHwiFxn"、hwi0Params);

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

    尊敬的 Rafal:

    >> hwi0Params.EventID = 32;<-我仍然不知道我是否在这里输入 int 编号

    事件 ID 字段仅在 DSP 上使用。 在所有 ARM 目标上忽略它们。

    >> 您认为我应该将电路板上的焊盘槽布板更改为 BeagleBoard x-15吗?

    这两种电路板均支持 SYS/BIOS (TI-RTOS 内核)、因此我认为您无需进行切换。

    >> 问题是当我布置 Hwi 函数时、它开始无限执行。

    我猜、对应于 Hwi 的中断会重复触发。 如果中断是由 Hwi_post ()触发而不是在 Hwi 函数中清除的、就会发生这种情况。 A8中断控制器不会自动清除已发布的软件中断、因此您必须在中断函数中手动清除。 有一个 Hwi_clearPostedInterrup() API 可用于清除软件中断(请参阅下面的 API CDOC 链接)。 外设触发的常规中断不需要执行此步骤。

    最棒的

    Ashish

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

    感谢您的回答。 我最终发现了 Hwi_clearPostedInterrup()这个函数只在位于目标特定支持->Arm->A8下的 HWI 的 API 中,但是当我使用在调度下可以找到的缺省 Hwi 时,它没有一个 Hwi_clearPostedInterrupt,只是一个正常的 Hwi_clearinterrupt()。 我感觉我需要清除这个布置的中断、但是当使用默认 Hwi 时、我无法清除。  


    好的、但我遇到了另一个主要问题。 我尝试使用计时器、在调试它之后、我的程序进入 syscalls.c 并运行_exit (函数)。 我添加了位于 Target Specific support->ARM->A8->Timer 下的 DMTimer。 我在一个带有任务和一个名为 timerIsr 的函数的 Sys/BIOS 最小项目上尝试了它、其中包含 System_printf、但它仍然不起作用。 我想这就是 TI-RTOS 和 A8兼容性的问题。 下面是我的代码和打印屏幕、其中显示了按下调试按钮并运行几秒钟以及计时器设置后得到的结果:

    #include

    #include

    #include

    #include

    /*
    *==== taskFxn ====
    *

    空 timerIsr (空)

    system_printf ("我是您的计时器!!!!\n");

    void taskFxn (UARg a0、UARg A1)

    system_printf ("enter taskFxn ()\n");

    Task_sleep (10);

    system_printf ("exit taskFxn ()\n"\});

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

    /*
    *使用 ROV->SysMin 查看循环缓冲区中的字符
    *
    system_printf ("enter main()\n");

    BIOS_start();/*不返回*/
    返回(0);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在 SysMin -> OutputBuffer 下、我得到的是这种情况、而不是我想要的 System_printf:

    {MODULE#53}:第205行:错误{id:0x1c0000、args:[0x8000825c、0x80008258]}
    xdc.runtime.Error.raise:终止执行
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能否共享项目中的*。cfg?

    关于错误消息、我认为错误/日志/断言字符串未加载。 您可以通过将应用程序的*。cfg 文件中的"text.isLoaded"选项设置为 true 来启用加载字符串。 您可以手动编辑 cfg 文件以执行此操作。 完成此操作后、将打印触发错误的模块名称、以便更轻松地进行调试。

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

    VAR 默认值= xdc.useModule('xdc.runtime.Defaults');
    VAR 诊断= xdc.useModule('xdc.runtime.Diags');
    VAR 错误= xdc.useModule('xdc.runtime.Error');
    VAR 日志= xdc.useModule('xdc.runtime.Log');
    VAR LoggerBuf = xdc.useModule('xdc.runtime.LoggerBuf');
    VAR Main = xdc.useModule('xdc.runtime.Main');
    VAR SysMin = xdc.useModule('xdc.runtime.SysMin');
    VAR 系统= xdc.useModule('xdc.runtime.System');
    var text = xdc.useModule('xdc.runtime.Text');

    VAR BIOS = xdc.useModule('ti.sysbios.BIOS');
    VAR Hwi = xdc.useModule('ti.sysbios.hal.Hwi');
    VAR 任务= xdc.useModule('ti.sysbios.knl.Task');
    VAR 计时器= xdc.useModule('ti.sysbios.timers.dmtimer.Timer');

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

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

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

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

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

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

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

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

    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 库。 自定义库将小于
    *预构建的"已检测"(默认)和"未检测"库。
    *
    * BIOS.logsEnabled 参数指定是否启用日志记录
    *在 BIOS 中执行此自定义构建。 RTA 和使用了这些日志
    * UIA 分析工具。
    *
    * BIOS.sertsEnabled 参数指定 BIOS 代码是否会
    * include assert()检查。 将此参数设置为"false"将生成
    *建议使用更小、更快的代码、但启用断言
    *早期开发过程中的 assert()检查将捕获大量编程
    *错误(无效参数等)
    *
    BIOS.libType = BIOS.LibType_Custom;
    BIOS.logsEnabled = false;
    BIOS.sertsEnabled = true;

    /*
    *创建任务。 'taskFxn'函数可在 main.c 中找到
    *
    VAR task0Params = new Task.Params();
    VAR task0 = Task.create ("&taskFxn"、task0Params);
    var timer0Params =新 Timer.Params();
    timer0Params.instance.name ="timer0";
    timer0Params.period = 1000000;
    program.global.timer0 = Timer.create (空、"&timerIsr"、timer0Params);
    Timer.intFreq.lo = 32768;
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    直到我添加计时器、一切都正常。 您可以看到、在使用计时器调试程序后、我最终进入此退出函数、而不是主函数的开始、当我单击"启动程序"时、程序就会结束。 因此、计时器或我的电路板配置存在主要问题。 我专门制作了一个只有计时器的最小默认项目、向您展示这是计时器问题。 我没有更改任何内容、也没有添加我的代码。 您能不能欺骗计时器是否能够处理您的某些 AM335x 处理器、因为可能是 BeagleBone Black 故障或某种其他配置问题。 也许我必须更改旧版本上的 XDC 内核。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Rafal:

    我们在 AM335x A8上运行计时器测试、作为每个版本之前内核回归测试的一部分、因此计时器已经过测试、预计可以正常工作。 这可能是配置问题。

    您是否尝试将"text.isLoaded"设置为 true,以便我们可以看到您在错误输出中看到的字符串? 这将是开始调试的第一步。

    我看到的一个常见问题是未启用计时器时钟。 您可以通过在 CCS 存储器浏览器中查看计时器 MMR 来验证计时器是否已启用。 如果您看到????????? 或者无法读取类型错误消息、则计时器时钟未启用。 在本文档的 AM335x 下可以找到计时器基址:

    最棒的

    Ashish

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

    我将 text.isLoaded 更改为 true,并得到以下字符串错误:

    {MODULE#51}:第205行:E_dataAbort:PC = 0x80008270、LR = 0x8000826c。
    xdc.runtime.Error.raise:终止执行

    我的 DMTimmer (我选择了 id 1)没有启用我得到了??????????????? 地址0x48042000。 您可以在打印屏幕上欺骗它。 这会使我的代码停止调试吗?

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

    您是否有任何想法、我应该怎么做、或者我应该阅读什么手册来修复它? 我陷入困境、我不知道应该寻求帮助。    

    e2e.ti.com/.../150298 这是解决我的问题的解决方案吗?我是否启用了 perpieral I MMU?

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

    尊敬的 Rafal:

    SYS/BIOS 应添加 MMU 条目、以默认映射计时器 MMR。 我认为问题是没有启用定时器时钟。 这是引导加载程序(在生产中)或 GEL 脚本(在开发期间)应执行的操作。

    以下是用于在 AM3359上启用计时器的 GEL 代码:

    Hotmenu EnableTimer_32KHz ()
    {
    WR_MEM_32 (CM_PER_TIMER2_CLKCTRL、0x2);
    WR_MEM_32 (CLKSEL_TIMER2_CLK、0x2);
    
    WR_MEM_32 (CM_PER_TIMER3_CLKCTRL、0x2);
    WR_MEM_32 (CLKSEL_TIMER3_CLK、0x2);
    
    WR_MEM_32 (CM_PER_TIMER4_CLKCTRL、0x2);
    WR_MEM_32 (CLKSEL_TIMER4_CLK、0x2);
    
    WR_MEM_32 (CM_PER_TIMER5_CLKCTRL、0x2);
    WR_MEM_32 (CLKSEL_TIMER5_CLK、0x2);
    
    WR_MEM_32 (CM_PER_TIMER6_CLKCTRL、0x2);
    WR_MEM_32 (CLKSEL_TIMER6_CLK、0x2);
    
    WR_MEM_32 (CM_PER_TIMER7_CLKCTRL、0x2);
    WR_MEM_32 (CLKSEL_TIMER7_CLK、0x2);
    
    GEL_TextOut ("为32KHz 启用定时器2-7。\n");
    } 

    将其添加到 GEL 文件后、它应显示为 GEL 文件菜单项。 在加载和运行应用程序之前、您需要运行它。 或者、您也可以在 GEL 文件的 ON_TARGET_CONNECT()函数中添加对此的调用、以便每次在 CCS 中连接 A8时自动运行。

    最棒的

    Ashish

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    非常感谢您的帮助!!!! 我的应用程序开始运行。 我有一个问题、我能否详细了解此 GEL 文件、因为我是 TI-RTOS 的新用户、是否有任何有关 bableboneback (AM335x)或 BeagleBoard (am572x)的示例、如果 ARM 主机和 PRUSS 之间存在某种通信、则会加速我的项目。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Rafal:

    以下是我在 GEL 文件中找到的一些资源。 希望它们能有所帮助:
    processors.wiki.ti.com/.../GEL
    www.ti.com/lit/an/spraa74a/spraa74a.pdf

    关于 ARM 和 PRUSS 之间的通信示例、这不属于我的专业领域。 您能否在 Sitara 论坛上启动新主题以提出该问题? 来自 Sitara 支持团队的人员应该能够为您提供帮助。

    最棒的
    Ashish