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/LAUNCHXL-F28379D:driverlib 是否与 SYS/BIOS 兼容?

Guru**** 2595805 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/671552/rtos-launchxl-f28379d-is-driverlib-compatible-with-sys-bios

器件型号:LAUNCHXL-F28379D
主题中讨论的其他器件:C2000WARE

工具/软件:TI-RTOS

您好!

我为非 BIOS 项目编写了自己的 I2C 库。 现在、我要编写 BIOS 版本。 我创建了一个项目、并添加了 driverlib 头文件。 我添加了 driverlib 源代码、并添加了指向项目的路径。 工程会编译、但当我放入代码时、driverlib 应用程序中的任何函数都会崩溃。

那么、这是我的问题-在 SYS/BIOS 项目中是否有任何方法使用 driverlib?

BR、

Dawid。

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

    它们兼容。 您能告诉我您看到的碰撞的更多信息吗? 您是否收到错误消息?

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

    尊敬的惠特尼:

    我看不到"红色错误"、但在按下"播放"按钮后、我的应用程序会立即停止。 我同时解决了这个问题-我意识到我添加了"Interrupt_initVectorTable();"行。 我在使用 RTOS 时看到这是禁止的。 现在、我还有另一个问题。

    我想使用 I2C、所以我创建了 Hwi (INT8.1有88个数字)、我将88作为中断编号。 我是否应该在 RTOS 中执行其他操作来启用此中断?

    以下是我的代码:

    #include 
    #include 
    #include 
    #include 
    #include 
    
    #include "driverlib.h"
    #include "device.h"
    #include "i2c_library.h"
    
    #define SLAVE_ADDRESS 0x20
    
    I2C_Master_t I2cMaster;
    
    //全局函数
    void I2C_lib_init (uint32_t I2C_base、I2C_Master_t * i2c)
    {
    *i2c = InitializeFunctionPointers();
    
    // zapisanie w strukturze adresu używanego modułu I2C
    I2C->I2C_base = I2CA_BASE;
    
    //必须在配置 I2C 之前将其复位
    I2C_DisableModule (I2C_base);
    
    // I2C 配置。
    I2C_initMaster (I2C_base、DEVICE_SYSCLK_FREQ、400000、I2C_DUTYCYCLE _50);
    I2C_setBitCount (I2C_base、I2C_BITCOUNT_8);
    I2C_setEmulationMode (I2C_base、I2C_emulation_free_run);
    
    //启用停止条件和寄存器访问就绪中断
    I2C_enableInterrupt (I2C_base、I2C_INT_STOP_Condition |
    I2C_INT_REG_ACCESS_RDY |
    I2C_INT_RX_DATA_RDY |
    I2C_INT_TX_DATA_RDY |
    I2C_INT_NO_ACK
    );
    
    // FIFO 配置
    I2C_enableFIFO (I2C_base);
    //I2C_clearInterruptStatus (I2C_base、I2C_INT_RXFF | I2C_INT_TXFF);
    
    //配置完成。 启用模块。
    I2C_enableModule (I2C_base);
    }
    
    
    //
    *=== main ====
    */
    int main()
    {
    GPIO_setPinConfig (GPIO_104_SDAA);
    GPIO_setPadConfig (104、GPIO_PIN_TYPE_PULLUP);
    GPIO_setQualificationMode (104、GPIO_QUAL_异 步);
    GPIO_setPinConfig (GPIO_105_SCLA);
    GPIO_setPadConfig (105、GPIO_PIN_TYPE_PULLUP);
    GPIO_setQualificationMode (105、GPIO_QUAL_ASYNC_A);
    
    interrupt_initModule();
    // Interrupt_initVectorTable();
    I2C_lib_init (I2CA_BASE、&I2cMaster);
    //中断_ENABLE (INT_I2CA);
    
    /*
    *将"Hello world"打印到日志缓冲区。
    *
    log_info0 ("Hello world\n");
    
    /*
    *启动 BIOS
    *执行几个最终初始化、然后执行
    *进入持续调用的循环
    *已安装空闲函数。
    *
    BIOS_start();/*不返回*/
    return (0);
    }
    
    /*
    ==== myIdleFxn ===
    *从
    BIOS_start()线程内反复调用的后台空闲函数*。
    */
    void myIdleFxn (void)
    {
    uint8_t DATA[]={0x0F、0x1F、0x2F、0x3F、0x4F};
    if (I2cMaster.status = I2CM_STATUS_READY)
    if (!I2C_getStopConditionStatus (I2CA_BASE))
    I2C_lib_MasterWriteRead (&I2cMaster、SLAVE_ADDRESS、DATA、0、5);
    }
    
    void I2caISR()
    {
    I2C_lib_InterruptHandler (&I2cMaster);
    }
    

    我不确定是否可以在 RTOS 中使用诸如 DEVICE_INIT()、Device_initGPIO()或 Interrupt_enable (INT_I2CA)之类的函数。

    我可以在示波器中看到 I2C 线路上没有发生任何情况、因此我认为 I2C 配置错误。 那么、我应该如何在 RTOS 中正确执行它呢?

    BR、
    Dawid。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您仍需要 Device_init()的一部分。 SYS/BIOS 引导模块可以为您配置系统时钟、但它不会启用外设时钟。 调用 Device_enableAllPeripheral()或调用 sysctl_enablePeripheral()以获取您正在使用的特定外设。 SYS/BIOS 不配置任何 GPIO、因此 Device_initGPIO()可以按原样调用。

    Hwi 模块应负责初始化矢量表并启用您在 PIE 和 CPU 中使用的中断、因此您不必调用中断模块函数。

    processors.wiki.ti.com/.../BIOS_for_the_28x

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

    Whitney、

    根据您之前的消息、我对我的代码进行了一些更改。 其中包括:

    SYSCTL_setLowSpeedClock (SYSCTL_LSPCLK_PRESALE_4);
    device_enableAllPeripheral();
    DEVICE_initGPIO();
    GPIO_setPinConfig (GPIO_104_SDAA);
    GPIO_setPadConfig (104、GPIO_PIN_TYPE_PULLUP);
    GPIO_setQualificationMode (104、GPIO_QUAL_异 步);
    GPIO_setPinConfig (GPIO_105_SCLA);
    GPIO_setPadConfig (105、GPIO_PIN_TYPE_PULLUP);
    GPIO_setQualificationMode (105、GPIO_QUAL_ASYNC_A);
    
    interrupt_initModule();
    I2C_lib_init (I2CA_BASE、&I2cMaster);
    INTERRUPT_ENABLE (INT_I2CA); 

    现在、I2C 将触发并将中断处理程序触发到、但下面是我从控制台发出的日志:

    [C28xx_CPU1]节拍数= 1
    ackOverflow:ISR 栈溢出。
    xdc.runtime.Error.raise:终止执行


    已选中 BIOS 配置中的自动确认。 我已检查 BIOS 配置、可以看到:

    我不确定该时钟频率是否正确。 在非 BIOS 项目中、我的时钟频率始终为200MHz。  ackOverflow:ISR 栈溢出可能 是由错误的 CPU 时钟设置引起的?

    BR、

    Dawid。

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

    我不认为时钟频率会导致堆栈溢出。 在上面发布了屏幕截图的那个页面上、尝试增大"系统(Hwi 和 Swi)堆栈大小"字段、看看这是否有用。 您可以在 CCS 调试会话中使用 ROV (它位于 Tools > ROV Classic for Me 下-可能取决于您使用的版本)来检查堆栈使用情况。 从模块列表中选择 Hwi、然后单击模块选项卡以获取堆栈信息。

    但是正确的是、SYS/BIOS 已将 SYSCLK 配置为以与 C2000Ware 代码不同的速度运行。 您可以在引导模块中对此进行调整。

    惠特尼

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

    Whitney、

    非常感谢您向我发送时钟配置。 它工作正常。

    我增加了堆栈大小、并在一段时间内观察具有不同配置的 Hwi 堆栈峰值。 我注意到,当我使用 System_printf()和 System_flush()堆栈峰值大得多。 它大于300。 现在、当我注释出 system_printf 和 system_flush 堆栈峰值时、它小于默认的256、但它仍然很高、我认为:

    我认为这是一个很大的数字。 你怎么看?

    BR、
    Dawid。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    printf 函数往往会使用相当多的堆栈、因此这不会让我感到意外。 不过、我认为您看到的数字也不是令人担忧的大数字。 您的 Hwi 中是否有几个函数调用? 您可以尝试单步执行代码并在内存浏览器中查看堆栈、以便在您担心的情况下查看其来源。

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

    我的 Hwi 看起来像这样:

    void I2caISR()
    {
    I2C_lib_InterruptHandler (&I2cMaster);
    } 

    其中 I2C_lib_InterruptHandler 为:

    void I2C_lib_InterruptHandler (I2C_Master_t * i2c)
    {
    I2C_InterruptSource intSource = i2c->GetInterruptSource (i2c->I2C_base);//I2C_getInterruptSource (i2c->I2C_base);
    
    switch (intSource)
    {
    I2C_INTSRC_TX_DATA_RDY 案例:
    I2C_lib_MasterWriteHandler (i2c);
    中断;
    I2C_INTSRC_RX_DATA_RDY 案例:
    I2C_lib_MasterReadHandler (i2c);
    中断;
    I2C_INTSRC_REG_ACCESS_RDY 案例:
    I2C_lib_MasterRegAccessReadyHandler (i2c);
    中断;
    I2C_INTSRC_NO_ACK 案例:
    I2C_lib_MasterNoAckHandler (i2c);
    中断;
    情况 I2C_INTSRC_STOP_Condition:
    I2C_lib_MasterStopConditionHandler (i2c);
    中断;
    }
    } 

    你怎么看? 这是 RTOS 中的一种好方法、还是应该触发 Swi 来处理此中断?

    我在"Memory Browser"中查看、可以看到:

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这看起来不错。 是否应该更改为 Swi 通常取决于你的其他 Hwi 的优先级是什么、以及哪些需要能够相互中断。

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

    Whitney、

    我知道。 非常感谢您的帮助、您真的为我提供了很多帮助。 现在、我有一个很好的机会来进一步探索 BIOS。

    BR、

    Dawid。