硬汉嵌入式论坛

 找回密码
 立即注册
查看: 904|回复: 6
收起左侧

[FreeRTOS] FreeRTOS中断里启动软件定时器,程序卡住

[复制链接]

2

主题

23

回帖

29

积分

新手上路

积分
29
发表于 2023-11-21 19:16:45 | 显示全部楼层 |阅读模式
程序中需要接收串口数据,于是接收数据的思想是这样的。

串口中断接收到字节,启动定时器定时,在定时时间内收到新字节,则重新计时,一直到定时器超时调用回调函数处理接收到的数据。(类似modbus)
但实际无法实现功能,仿真进去在如下图片处停住

port.c文件 764行

port.c文件 764行


定时器创建为单次模式,创建完后不启动,仿真进去已经确认是创建成功了的。
屏幕截图 2023-11-21 185713.png

串口接收中断,接收到字节则启动定时器
屏幕截图 2023-11-21 185928.png

中断优先级组已经配置为了GROUP4,串口中断配置为了10

中断优先级组

中断优先级组

屏幕截图 2023-11-21 190423.png

有关软件定时器的配置
屏幕截图 2023-11-21 191433.png

已经百度查过,都是一堆关于软件定时器的教程和说明,无法解决我的问题。


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106726
QQ
发表于 2023-11-22 08:07:24 | 显示全部楼层
卡在第1个截图上,说明你的优先级配置是有问题的。那个函数就是就是验证你的NVIC分组和中断配置有效性的。

再看你的代码,这个中断配置有问题,FreeRTOS下的NVIC配置有效性的情况下,这个中断是不能配置到最高抢占优先级的。


下载 (2).png
回复

使用道具 举报

2

主题

23

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2023-11-22 09:24:45 | 显示全部楼层
可以了,谢谢硬汉哥,中断管理的知识我还是要系统的认识学习一下。
回复

使用道具 举报

2

主题

23

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2023-11-24 21:05:25 | 显示全部楼层
硬汉大哥,在任务中调用xTimerReset()又出现了问题
回复

使用道具 举报

2

主题

23

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2023-11-24 21:20:33 | 显示全部楼层
eric2013 发表于 2023-11-22 08:07
卡在第1个截图上,说明你的优先级配置是有问题的。那个函数就是就是验证你的NVIC分组和中断配置有效性的。
...

硬汉大哥,我这里又出现了问题,在任务中调用xTimerReset函数,会进入configASSERT( ucCurrentPriority >= ucMaxSysCallPriority );

port.c 789行

port.c 789行

在网上查资料,不是很明白问题在哪里。

网上查的资料1

网上查的资料1

网上查的资料2

网上查的资料2


根据网上查看的优先级

根据网上查看的优先级


[C] 纯文本查看 复制代码
    /* enter critical */
    taskENTER_CRITICAL(); 

    MultibuttonTimer_Create();
    CommToMCU2Timer_Create();
    RecloseRecvTimer_Create();
    NST1001Timer_Create();

    /* create led2 task */
    if(xTaskCreate((TaskFunction_t )led2_task_function,     
                    (const char*    )"LED2_task",   
                    (uint16_t       )512, 
                    (void*          )NULL,
                    (UBaseType_t    )2,
                    (TaskHandle_t*  )&led2_handler) != pdPASS)
    {

    }        
    else
    {
        //printf("LED2 task was created successfully.\r\n");
    }


RecloseRecvTimer_Create()是定时器的创建

[C] 纯文本查看 复制代码
void RecloseRecvTimer_Create(void)
{

    RecloseRecvTimer_Handler = xTimerCreate((const char *)"RecloseRecv_Timer_Callback",
                                            (TickType_t)20,         /* 5ms */
                                            (UBaseType_t)pdFALSE,    /* 单次模式 */
                                            (void*)5,
                                            (TimerCallbackFunction_t)RecloseRecv_Timer_Callback);

    if(RecloseRecvTimer_Handler != NULL)
    {

    }

}


在led2_task_function中调用回调函数
[C] 纯文本查看 复制代码
/* led2 task function */
void led2_task_function(void *pvParameters)
{
    TickType_t xLastWakeTime;
    xLastWakeTime = xTaskGetTickCount();

    uint32_t val;
    BaseType_t xReturn = pdTRUE;

    while(1)
    {
        LED1_Toggle();
        rtc_time_get();

        AdcSampleHandler.SampleStartFlag = 1;
        NST1001TimerGenenal_CallBack();
        Reclose_ReadStatus();       /* 读重合闸状态 */
        CommToMCU2_SendM01S01();    /* 读交流电压电流 */
        ModbusReg_Update();
        vTaskDelayUntil(&xLastWakeTime,2000);
     
    }
}


xTimerReset在函数Reclose_ReadStatus里面,实现发送后开始计时
[C] 纯文本查看 复制代码
/* 读状态 */
void Reclose_ReadStatus(void)
{
    uint8_t i = 0;
    uint16_t tempCRC;

    Reclose_TxData[i++] = 0x01;     /* 从机地址 */
    Reclose_TxData[i++] = 0x03;     /* 功能码 */
    Reclose_TxData[i++] = 0x00;     /* 寄存器地址高 */
    Reclose_TxData[i++] = 0x02;     /* 寄存器地址低 */
    Reclose_TxData[i++] = 0x00;     /* 寄存器数量高 */
    Reclose_TxData[i++] = 0x01;     /* 寄存器数量低 */

    tempCRC = do_crc(Reclose_TxData,i);  /* 计算CRC */
    Reclose_TxData[i++] = ((uint8_t *)&tempCRC)[0];     /* CRC */
    Reclose_TxData[i++] = ((uint8_t *)&tempCRC)[1];     /* CRC */

    RECLOSE_Uart_SendString(Reclose_TxData , i);
    /* 发送完定时 */
    xTimerReset(RecloseRecvTimer_Handler, 20);
}


定时器的优先级还是与之前一致

定时器优先级

定时器优先级


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106726
QQ
发表于 2023-11-25 08:48:08 | 显示全部楼层
慕容薯条 发表于 2023-11-24 21:20
硬汉大哥,我这里又出现了问题,在任务中调用xTimerReset函数,会进入configASSERT( ucCurrentPriority > ...

之前研究过这个没,研究下。

第12章 FreeRTOS中断优先级配置(重要)
https://www.armbbs.cn/forum.php?mod=viewthread&tid=21094
回复

使用道具 举报

2

主题

23

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2023-11-28 09:17:11 | 显示全部楼层
eric2013 发表于 2023-11-25 08:48
之前研究过这个没,研究下。

第12章 FreeRTOS中断优先级配置(重要)

看起来我这个不是中断配置的问题,是用jlink仿真偶尔才会出现的问题。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-1 19:58 , Processed in 0.183643 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表