rt_thread使用过程中问题记录

本文详细解析了RT-Thread系统中线程管理与串口操作的关键技术,包括线程删除、事件处理机制、串口波特率修改及串口初始化流程,同时提供了实用的工程模板创建方法和解决线程栈溢出问题的技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

6、删除线程:

rt_thread_delete函数不能在要删除的线程中调用,在其他线程中使用删除此线程。

5、修改串口波特率:

void UART2_change_baud(int baud)
{
    struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;  /* 初始化配置参数 */

    /* 修改串口配置参数 */
    config.baud_rate = baud;        //修改波特率为 9600
    //config.data_bits = DATA_BITS_8;           //数据位 8
    //config.stop_bits = STOP_BITS_1;           //停止位 1
    //config.bufsz     = 128;                   //修改缓冲区 buff size 为 128
    //config.parity    = PARITY_NONE;           //无奇偶校验位

    /* 控制串口设备。通过控制接口传入命令控制字,与控制参数 */
    rt_device_control(uart_bluetooth_dev, RT_DEVICE_CTRL_CONFIG, &config);
}

4、线程中有事件处理函数rt_event_recv时,当没有事件触发时线程会挂起来,此时线程其他函数就不执行了。

比如线程中

while(1)

{

 BLE_BAUD();

if (rt_event_recv(&event, 1,
                              RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR,
                              RT_WAITING_FOREVER, &e) == RT_EOK    )

{...}

}

线程先执行BLE_BAUD(),再执行rt_event_recv,此时没有事件触发就会挂起来,因为设的是RT_WAITING_FOREVER,一直等待事件触发,就不再执行BLE_BAUD()了。

1.转自https://www.rt-thread.org/qa/forum.php?mod=viewthread&tid=7937&extra=&ordertype=1

要建一个工程模板可以使用rt_thread库里的模板进行修改, 在bsp文件夹中有很多型号的例程,比如rt-thread-v3.1.0\bsp\stm32f107,用env软件cd指令打开,然后menuconfig命令修改配置,save保存,esc退出后,scons命令重新编译,用scons --dist生成新的工程,它就会在stm32f107\dist文件夹中生成新的工程,可以直接拷到别的地方。

 

2.如何使用rt_thread的串口函数:

资料参见https://www.rt-thread.org/document/site/submodules/rtthread-manual-doc/zh/1chapters/06-chapter_device/#stm32f10x

要使用串口3作为modbus接口,初始化流程如下:

void thread_entry_SysMonitor(void* parameter)
{

  
    uart_wifi_dev = rt_device_find("uart3");  

    if(uart_wifi_dev!=RT_NULL)  
    {  
        rt_device_open(uart_wifi_dev, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_INT_RX); //#define RT_DEVICE_FLAG_INT_RX   0x100   /* 设备以中断接收模式打开  */ 
        while(1)                                                                    //#define RT_DEVICE_OFLAG_RDWR    0x003   /* 以读写方式打开设备      */
        {  
//        rt_device_write(uart_wifi_dev,0,"Hello Wi-Fi!\r\n",14);  
            MODS_Poll();
        rt_thread_delay(5);  
        }        
    }  
}

一开始使用的是 rt_device_open(uart_wifi_dev, RT_DEVICE_OFLAG_RDWR);

只能发不能收,不会进接收中断,需添加 RT_DEVICE_FLAG_INT_RX

3、转自https://www.cnblogs.com/wan0807/p/10123855.html

还未用到,先记下来

“近日在移植了RTThread nano到程序中后,发现程序运行一会(半小时到一个钟头不等)就会进HardFault,给我的直觉就是线程栈溢出了,但我还是不能确定是这个问题。由于处理器资源有限,所有只移植了RTThread的kernel,像finish什么的都没有移植。如此以来,我就不能通过finish去查看内存使用情况了。

2、解决问题:

方法一:  一筹莫展之时,突然想起一个办法可以试试,在进Hardfault的位置放置断点,当程序运行至此处时,通过watch window查看线程栈数组,(线程栈初始化时全部用“#”0x23进行了填充,栈使用过的部分就会将0x23给覆盖掉),是不是整个栈区都没有连续的0x23了,若是,则证明栈溢出了。

方法二:  同样可以通过查看map文件,找到栈的起始地址,通过memory来查看,栈是否溢出。"

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值