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.

[参考译文] CC3220S-LAUNCHXL:BTN 中断冻结

Guru**** 2540720 points
Other Parts Discussed in Thread: CC3220S

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/749658/cc3220s-launchxl-btn-interrupt-freezes

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

您好!

我使用的是 WiFi_Doorlock 示例的基本代码。 我有一个 BTN 中断,如下所示,每当它发生时,程序就会在执行 httpTask()时冻结。 我已经测试了 httpTask()本身的工作正常。 如何解决此问题?

void gpioButtonFxn0 (uint_least8_t index)
{
/*清除 GPIO 中断并切换 LED */
GPIO_clearInt (Board_GPIO_Button1);
GPIO_TOGGLE (Board_GPIO_LED0);

httpTask();
}//*


=== mainThread ====
*/
void *BTNTask (void *arg0)
{
/*调用驱动程序初始化函数*/
//GPIO_init();

/*配置 LED 和按钮引脚*/
GPIO_setConfig (Board_GPIO_LED0、GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
GPIO_setConfig (Board_GPIO_Button1、GPIO_CFG_IN_pu | GPIO_CFG_IN_INT_INT_RISING);

/*打开用户 LED */
GPIO_WRITE (Board_GPIO_LED0、Board_GPIO_LED_ON);

/*安装按钮回调*/
GPIO_setCallback (Board_GPIO_Button1、gpioButtonFxn0);

/*启用中断*/
GPIO_enableInt (Board_GPIO_Button1);

返回(NULL);
} 

这里也是我创建 BTNTask 的方式。

extern void *BTTask (void *arg0);
static Int32_t BTN_start ()
{
int32_t retc = 0;

#if (BTN = 1)
/*线程创建变量*/
pthread_attr_t pAttrs;
struct sched_param primParam;

pthread_attr_init (&pAttrs);
priParam.sched_priority = 1;

retc = pthread_attr_setschedparam (&pAttrs、&priParam);
retc |= pthread_attr_setstacksize (&pAttrs、1024);
retc |= pthread_attr_setdetachstate (&pAttrs、pthread_create_detached);
#ifdef debug_print
如果(retc < 0)
{
display_printf (
显示屏、
0、
0、
"\t [Main Thread] Error - Unable to configure BTN thread parameters");
}
#endif

retc = pthread_create (&g_BTN_thread、&pAttrs、BTTask、NULL);
#endif

返回 retc;
} 

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

    尊敬的 Jack:

    函数 httpTask()内的内容是什么? 可以在短时间内多次调用? 如果从中断处理程序上下文调用此函数、 则可以通过按一下按钮(释放)来调用多次、因为在按键接触时反弹 您可以通过 RC 滤波器或软件避免这种情况

    1月

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

     httpTask()的内部如下所示。 我认为问题不是因为去抖问题。 我甚至在计时器中断中测试了相同的代码、但仍然遇到相同的问题。 似乎没有中断可以处理这么大的任务。 我应该如何解决这个问题?

    bool MoreDataFlag = false;
    char data[HTTP_MIN_RECV];
    int16_t ret = 0;
    int16_t len = 0;
    
    display_printf (display、0、0、"向'%s'发送 HTTP GET 请求\n"、
    主机名);
    
    HttpClient_handle httpClientHandle;
    int16_t statusCode;
    httpClientHandle = HttpClient_create (&statusCode、0);
    if (statusCode < 0)
    {
    printError ("httpTask:创建 http 客户端句柄失败",statusCode);
    }
    
    RET = HttpClient_setHeader (httpClientHandle、HttpClient_HFIELD_REQ_USER_AGENT、USER_AGENT、strlen (USER_AGENT)、HttpClient_HFIELD_PERSISTENT);
    如果(ret < 0){
    printError ("httpTask:设置请求标头失败"、ret);
    }
    
    RET = HttpClient_connect (https://ClientHandle、HOSTNAME、0、0);
    如果(ret < 0){
    printError ("httpTask: connect failed"、ret);
    }
    RET = HttpClient_sendRequest (httpClientHandle、HTTP_METHOD_Get、Request_URI、NULL、0、0);
    如果(ret < 0){
    printError ("httpTask: send failed"、ret);
    }
    
    if (ret!= HTTP_SC_OK){
    printError ("httpTask:无法获取状态"、ret);
    }
    
    display_printf (display、0、0、"HTTP 响应状态代码:%d\n"、ret);
    
    Len = 0;
    执行{
    RET = HttpClient_readResponseBody (httpClientHandle、data、sizeof (data)、&MoreDataFlag);
    如果(ret < 0){
    printError ("httpTask: Response body processing failed"、ret);
    }
    display_printf (display、0、0、"%.*s \r\n"、ret、data);
    len += ret;
    } while (MoreDataFlag);
    
    display_printf (display、0、0、"接收到的有效载荷%d 字节\n"、len);
    
    RET = HttpClient_ddisconnect (httpClientHandle);
    如果(RET < 0)
    {
    printError ("httpTask: disconnect failed"、ret);
    }
    
    HttpClient_Destroy (httpClientHandle); 

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

    否 计时器应具有与按钮相同的问题、但没有适当的去抖、除非在计时器中设置了很长的周期。 但还有更重要的事情。 SimpleLink API 不能从 ISR 上下文中调用。

    常见的方法是让您的任务中的代码和此任务通过在 ISR 上下文中触发的同步对象(例如信标)解除阻断。

    1月
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    当你说"常见的方法是让你的代码进入任务、并且这个任务通过 ISR 上下文中触发的同步对象(例如信标)来解除阻断"时、你能为此显示代码吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    请参阅 SDK 中的示例(例如\examples\rtos\CC3220S_LAUNCHXL\drivers\i2secho\)或具有函数 SEM_init()、SEM_POST ()、SEM_WAIT ()的任何其他示例。

    1月