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.

[参考译文] CC2642R:在添加通过 UART 发送数据的新函数时接收 HAL_ASSERT_SPINLOCK 错误

Guru**** 2003255 points
Other Parts Discussed in Thread: CC2642R, SYSCONFIG
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1459232/cc2642r-receiving-hal_assert_spinlock-error-while-adding-a-new-function-that-sends-data-via-uart

器件型号:CC2642R
主题中讨论的其他器件: SysConfig

工具与软件:

您好!  

我正在使用 CC2642R、以利用 BLE 并将 UART 数据发送到另一个控制器。 我已在某个特征的读取回调中插入了用户定义的函数。 数据已成功存储在存储器位置。 但是、当我尝试调用另一个通过 UART 发送特定数据的用户定义函数时、程序会卡在 HAL_ASSERT_SPINLOCK 中。 可能的原因是什么?

我的代码:

-->我的写回调函数:

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
bStatus_t simpleProfile_WriteAttrCB(uint16_t connHandle,
gattAttribute_t *pAttr,
uint8_t *pValue, uint16_t len,
uint16_t offset, uint8_t method)
{
bStatus_t status = SUCCESS;
uint8 notifyApp = 0xFF;
if ( pAttr->type.len == ATT_BT_UUID_SIZE )
{
// 16-bit UUID
uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]);
switch ( uuid )
{
case SIMPLEPROFILE_CHAR3_UUID:
// Validate the value
// Make sure it's not a blob operation
if ( offset == 0 )
{
if ( len > 40 )
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX



cloud_packet_decode_and_decrypt(completePacket);
APP_COMMAND_PARSE_AND_GENERATE_NEW (completePacket);

这是我将在 BLE 的写入回调函数中插入的2个函数。 现在、仅保留第一个函数、器件运行良好、但添加第二个函数后会出现问题...

有人能指出我在 处理问题时移动的方向吗?

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

    您好!  

    感谢您联系我们。  

    为了解相关信息、我编辑了您的消息、以使用代码块、因为阅读代码非常困难。 下次请使用论坛的代码插入功能。  

    针对您的问题、我相信您可能正在尝试在回调上下文中执行过多的代码。 我无法访问您的  cloud_packet_decode_and_decrypt()和 app_command_parse_and_generate_new ()实现 ,但如果它们可能应该在任务上下文中而不是在中断上下文中执行。

    我希望这将有所帮助、

    此致、  

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

    您好!

    抱歉、导致该问题肯定会使用代码插入函数。

    您能否更详细地解释最后一点:

     "也许可以在任务运行环境中执行、而不是在中断运行环境中执行。"

    因为我还尝试在任务环境中实现

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    int main()
    {
    /* Register Application callback to trap asserts raised in the Stack */
    halAssertCback = AssertHandler;
    Board_initGeneral();
    // Enable iCache prefetching
    VIMSConfigure(VIMS_BASE, TRUE, TRUE);
    // Enable cache
    VIMSModeSet(VIMS_BASE, VIMS_MODE_ENABLED);
    /* Register Application callback to trap asserts raised in the Stack */
    RegisterAssertCback(AssertHandler);
    #if !defined( POWER_SAVING ) || defined( USE_FPGA )
    /* Set constraints for Standby, powerdown and idle mode */
    // PowerCC26XX_SB_DISALLOW may be redundant
    Power_setConstraint(PowerCC26XX_SB_DISALLOW);
    Power_setConstraint(PowerCC26XX_IDLE_PD_DISALLOW);
    #endif // POWER_SAVING | USE_FPGA
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    所以我创建了另外一个任务、在这个任务中、我尝试调用这些函数。 不过、我会获得与 HAL_ASSERT_SPINLOCK 相同的错误(更具体地说是 HAL_ASSERT_CAUSD_ERROR)

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

    您好!  

    感谢您共享此代码片段。 你创建新线程的方式、以及你为其分配的优先级看起来是正确的。

    您是否还可以共享该新主题的内容? 除其他外、我想确保新创建的任务是启用 ICALL - https://software-dl.ti.com/simplelink/esd/simplelink_cc13xx_cc26xx_sdk/7.40.00.77/exports/docs/ble5stack/ble_user_guide/html/ble-stack-5.x/the-application.html#creating-additional-icall-enabled-tasks 

    此致、  

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

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    void *mainThread(void *arg0)
    {
    while(1)
    {
    Task_sleep(1000000);
    if(commandImplementFlag == 1)
    {
    cloud_packet_decode_and_decrypt(completePacket);
    app_command_parse_and_generate_new(decryptedCloudInput);
    uart_and_RS485("probe");
    commandImplementFlag = 0;
    }
    }
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    您好!

    另外、在 BLE 的读取回调函数中、我将阵列最多填充256个字节、然后将布尔变量设置为高电平。 此任务检查该变量、然后实现有待执行的函数。

    我已经浏览过启用 ICall 的任务文档、但我想了解必须如何准确地初始化任务才能使任务成为启用 ICall 的任务。 更具体地说  

    Fullscreen
    1
    2
    3
    4
    5
    6
    // ******************************************************************
    // N0 STACK API CALLS CAN OCCUR BEFORE THIS CALL TO ICall_registerApp
    // ******************************************************************
    // Register the current thread as an ICall dispatcher application
    // so that the application can send and receive messages.
    ICall_registerApp(&selfEntity, &syncEvent);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    考虑到我的线程、将要输入到 ICall 寄存器应用函数的参数将是什么...

    很抱歉花了你的时间,但我试图理解 iCall 的工作.....

    谢谢  

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

    您好!  

    SDK 中提供的示例应用程序创建线程 ICall 已启用、您可以参考这些应用程序。  

    下面的代码片段显示了如何定义 selfEntity 和 syncEvent。 请注意、这些符号应该被重命名以避免与示例应用所声明的符号发生冲突。  

    Fullscreen
    1
    2
    static ICall_EntityID selfEntity;
    static ICall_SyncHandle syncEvent;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    另请确保按照"Open SysConfig -> BLE -> Advanced Settings -> ICALL (打开 SysConfig ->高级设置-> ICALL)"步骤操作、并在"Max Number of ICall Enabled Tasks (启用 ICALL 任务的最大数量)"条目中添加一个。 我在前一条消息中指出的指南中定义了相应的定义。  

    此致、