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.

[参考译文] LP-EM-CC2745R10-Q1:在执行 TRNG_getRandomBytes () 时、MCU 不运行(异常处理程序)。

Guru**** 2401945 points
Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1523245/lp-em-cc2745r10-q1-the-mcu-does-not-operate-exception-handler-when-executing-trng_getrandombytes

器件型号:LP-EM-CC2745R10-Q1
主题:SysConfig 中讨论的其他器件

工具/软件:

您好、

在使用 CC2745 LaunchPad 和 simple_ble 示例开发工程时、我使用 TRNG.h 创建了一个函数、以获取所需长度的随机字节(lub_size 输入参数)到 laub_Rnd 数组中。 实现的代码 如下所示(我在 SysConfig 中手动添加了 TRNG、名称:CONFIG_TRNG_0、并且没有更改 TRNG syscfg 的任何值)。

#define RANDOM_BYTE_SIZE 4
// Added TRNG_init() immediately after Board_init() inside the main() function in main_freertos.c.
uint8 BLE_F_IF_Get_RandomByte(uint8* laub_Rnd, uint8 lub_size)
{
    TRNG_Handle handle;
    TRNG_Params params;
    int_fast16_t result;
    uint8 randomBytesArray[RANDOM_BYTE_SIZE] = {0};
    uint8 lub_byte_cnt = 0;
    uint8 lub_size_cnt = lub_size;
    uint8 lub_copy_len;

    TRNG_Params_init(&params);
    handle = TRNG_open(CONFIG_TRNG_0, &params);
    if (!handle) {
        // Handle error
        return BLE_D_FALSE;
    }
    while(lub_size_cnt > 0)
    {
        result = TRNG_getRandomBytes(handle, randomBytesArray, RANDOM_BYTE_SIZE);
        if (result != TRNG_STATUS_SUCCESS) {
            // Handle error
            TRNG_close(handle);
            return BLE_D_FALSE;
        }

        lub_copy_len = (lub_size_cnt >= RANDOM_BYTE_SIZE) ? RANDOM_BYTE_SIZE : lub_size_cnt;
        memcpy(&laub_Rnd[lub_byte_cnt], randomBytesArray, lub_copy_len);
        lub_byte_cnt += lub_copy_len;
        lub_size_cnt -= lub_copy_len;
    }
    
    TRNG_close(handle);
    return BLE_D_TRUE;
}

即使尝试 TRNG_OPEN (0、NULL)(如 TRNG.h 中的示例所示)、结果也是相同的。

#define RANDOM_BYTE_SIZE 4
// Added TRNG_init() immediately after Board_init() inside the main() function in main_freertos.c.
uint8 BLE_F_IF_Get_RandomByte(uint8* laub_Rnd, uint8 lub_size)
{
    TRNG_Handle handle;
    // TRNG_Params params;
    int_fast16_t result;
    uint8 randomBytesArray[RANDOM_BYTE_SIZE] = {0};
    uint8 lub_byte_cnt = 0;
    uint8 lub_size_cnt = lub_size;
    uint8 lub_copy_len;

    // TRNG_Params_init(&params);
    // handle = TRNG_open(CONFIG_TRNG_0, &params);
    handle = TRNG_open(0, NULL);
    if (!handle) {
        // Handle error
        return BLE_D_FALSE;
    }
    while(lub_size_cnt > 0)
    {
        result = TRNG_getRandomBytes(handle, randomBytesArray, RANDOM_BYTE_SIZE);
        if (result != TRNG_STATUS_SUCCESS) {
            // Handle error
            TRNG_close(handle);
            return BLE_D_FALSE;
        }

        lub_copy_len = (lub_size_cnt >= RANDOM_BYTE_SIZE) ? RANDOM_BYTE_SIZE : lub_size_cnt;
        memcpy(&laub_Rnd[lub_byte_cnt], randomBytesArray, lub_copy_len);
        lub_byte_cnt += lub_copy_len;
        lub_size_cnt -= lub_copy_len;
    }
    
    TRNG_close(handle);
    return BLE_D_TRUE;
}

执行该代码时、在调用 TRNG_getRandomBytes 函数后、LaunchPad 会落入 Exception_handlerSpin () 中。 调试时,我发现在执行 HSMLPF3_waitForResult 函数期间,它在 SemaphoreP_pend() 处属于一个异常。

如果我错过了任何其他设置或使用 API 时出现错误、我很好奇。

任何人都能帮助解决这个问题、或者在 simple_fble 示例中提供有关正确使用 TRNG_getRandomBytes () 的指导吗?

(SDK 版本:8.40.2.01、SysConfig:1.22.0)

谢谢你。

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

    你好、Jaeun、  

    我将研究这个问题、并在下周 (06/12) 提供星期四的答复。 对延迟深表歉意。  

    谢谢、  
    Isaac

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

    尊敬的 Issac:

    我将此留到此处、以防它有助于问题分析。

    上述函数是在 basic_ble 示例的 app_main() 中调用的。

    是否 需要提供任何其他信息?

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

    在调用 TRNG_Params_init () API 之前 、您是否可以尝试调用 TRNG_init () API? TRNG_INIT () API 负责初始化所有与 RTOS 相关的元数据、例如信标、中断和 ISR 回调。  

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

    您好、

    按照您的建议、我更改了代码、在 TRNG_Params_init (&params) 之前调用 TRNG_init ()、而不是在 main_freertos.c 中的 Board_init () 之后立即调用

    /*******************************************************
    * Changes in app_main.c of the CC2745 basic_ble example
    * No other parts were changed.
    ********************************************************/
    
    #include <ti/drivers/TRNG.h>
    #include <string.h>
    
    #define RANDOM_BYTE_SIZE 4
    uint8 BLE_F_IF_Get_RandomByte(uint8_t* laub_Rnd, uint8_t lub_size)
    {
        TRNG_Handle handle;
        TRNG_Params params;
        int_fast16_t result;
        uint8_t randomBytesArray[RANDOM_BYTE_SIZE] = {0};
        uint8_t lub_byte_cnt = 0;
        uint8_t lub_size_cnt = lub_size;
        uint8_t lub_copy_len;
    
        TRNG_init();
        TRNG_Params_init(&params);
        handle = TRNG_open(CONFIG_TRNG_0, &params);
        // handle = TRNG_open(CONFIG_TRNG_0, NULL);
        if (!handle) {
            // Handle error
            return 0;
        }
        while(lub_size_cnt > 0)
        {
            result = TRNG_getRandomBytes(handle, randomBytesArray, RANDOM_BYTE_SIZE);
            if (result != TRNG_STATUS_SUCCESS) {
                // Handle error
                TRNG_close(handle);
                return 0;
            }
    
            lub_copy_len = (lub_size_cnt >= RANDOM_BYTE_SIZE) ? RANDOM_BYTE_SIZE : lub_size_cnt;
            memcpy(&laub_Rnd[lub_byte_cnt], randomBytesArray, lub_copy_len);
            lub_byte_cnt += lub_copy_len;
            lub_size_cnt -= lub_copy_len;
        }
        
        TRNG_close(handle);
        return 0;
    }
    
    void appMain(void)
    {
        uint8_t laub_Rnd[16] = {0};
        (void)BLE_F_IF_Get_RandomByte(laub_Rnd, 16);
    
        // Call the BLEAppUtil module init function
        BLEAppUtil_init(&criticalErrorHandler, &App_StackInitDoneHandler,
                        &appMainParams, &appMainPeriCentParams);
    }
    
    

    但 LaunchPad 仍属于 exception_handlerSpin ()。

    这同样适用于以下代码。

     

    /*******************************************************
    * Changes in app_main.c of the CC2745 basic_ble example
    * No other parts were changed.
    ********************************************************/
    #include <ti/drivers/TRNG.h>
    #include <string.h>
    
    void Get_RandomByte(uint8_t* laub_Rnd, uint8_t lub_size)
    {
        TRNG_Handle handle;
        int_fast16_t result;
        uint8_t randomBytesArray[16] = {0};
        TRNG_init();
    
        handle = TRNG_open(0, NULL);
        if (!handle) {
            // Handle error
            while(1);
        }
        result = TRNG_getRandomBytes(handle, randomBytesArray, 16);
        if (result != TRNG_STATUS_SUCCESS) {
            // Handle error
            while(1);
        }
        memcpy(&laub_Rnd[0], randomBytesArray, 16);
        TRNG_close(handle);
    }
    
    void appMain(void)
    {
        uint8_t laub_Rnd[16] = {0};
        
        Get_RandomByte(laub_Rnd,16);
    
        // Call the BLEAppUtil module init function
        BLEAppUtil_init(&criticalErrorHandler, &App_StackInitDoneHandler,
                        &appMainParams, &appMainPeriCentParams);
    }

    我想知道它在您的 LaunchPad 上是否正常工作。

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

    是的。 我可以在我这边重现这个问题。 当我使用空的示例工程并将您的代码移植到该工程时、我不会看到问题。 现在、当我们尝试挂起操作信标时、硬故障正在发生、因为我们处于阻塞模式。 我确实给了它一个尝试与 RNG 潜水员和同样的运气。 我的初始评估是 BLE 栈与加密软件架构之间在中断优先级方面存在某种冲突。 希望在本周结束前提供更多详细信息和解决方案。

    谢谢你。

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

    您好、

    您上周提到过、您将对其进行分析。 分析是否已完成? 我对进展很好奇。

    如果您能分享这些进展、我将不胜感激。

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

    您好、

    您提供的代码运行良好。

    感谢您的答复。

    祝您愉快!