能用stm32f103串口idle中断唤醒Finsh线程吗?

发布于 2021-05-19 11:56:13    浏览:96

Finsh检测串口输入实现逻辑是啥呀?能用串口idle中断(stm32f103c8)唤醒Finsh线程吗?

查看更多

3 个回答
flashman2002
flashman2002 2021-05-19
This guy hasn't written anything yet

干嘛FISH线程需要唤醒?它一直在内存中运行,一般情况下不会进入休眠。

攸宁_
攸宁_ 2021-05-19
This guy hasn't written anything yet

把Finsh线程优先级调大一点(不大于main),当串口接收到数据时,把数据放在环形缓冲区,当接收完一帧时,在idle中发送事件,在函数rt_hw_console_getchar中判断环形缓冲区长度,当长度不为零时正常读数据,为零时挂起一直到等到idle事件到来。
rt_hw_console_getchar函数如下

signed char rt_hw_console_getchar(void){
    uint8_t Data;
    if(Rx2Circlarbuffer.LeftSize>0){
        Read_CircleBuffer_Data(&Rx2Circlarbuffer,&Data);
        return  Data;
    }
    rt_event_recv(Usart2_event,EVENT_FLAG1, RT_EVENT_FLAG_CLEAR|RT_EVENT_FLAG_OR,RT_WAITING_FOREVER,RT_NULL);
    return -1;    
}

串口中断函数如下

void usart2IDLECallback(void){
    if(Usart2_event!=RT_NULL){
        rt_event_send(Usart2_event, EVENT_FLAG1);
    }
    
}

void USART2_IRQHandler(void){                    //串口2中断服务程序
    u8 Res=0;    
    rt_interrupt_enter(); 
    if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)  
        {
            Res =USART_ReceiveData(USART2);
            Write_CircleBuffer_Data(&Rx2Circlarbuffer,Res);    //读取接收到的数据 
            usart2Callback(Res);
     }else if(USART_GetITStatus(USART2, USART_IT_IDLE) != RESET){
            USART2->SR; //先读SR寄存器
            USART2->DR; //再读DR寄存器
            usart2IDLECallback();    
     }
    rt_interrupt_leave();    //在中断中一定要调用这对函数,离开中断                                               
} 
游走在01的海洋
This guy hasn't written anything yet

一、下图是Finsh的命令执行流程图1.PNG
二、至于第二个问题:主要是没看懂你想做什么;Finsh是RT-Thread提供的一种调试方法,方便我们查看系统中的相关信息;你这样做是什么想法?
三、如果你的项目在最终不想添加Finsh线程,那在最终的时候直接不添加就好了。

撰写答案

请登录后再发布答案,点击登录
关注者
0
被浏览
96

发布
问题

分享
好友

手机
浏览

扫码手机浏览