野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 5347|回复: 8

[rt-thread] RT-Thread内核与应用开发实战指南(基于STM32)——例程中的bug(或者说疑问)

[复制链接]
发表于 2019-5-21 17:49:20 | 显示全部楼层 |阅读模式
clock.c文件中函数void rt_tick_increase(void)里面
        /* 扫描就绪列表中所有线程的remaining_tick,如果不为0,则减1 */
        for ( i = 0; i < RT_THREAD_PRIORITY_MAX; i ++ )
        {
                thread = rt_list_entry( rt_thread_priority_table[i].next,
                                                   struct rt_thread,
                                                   tlist );
                                                                                                               
                if ( thread->remaining_tick > 0 )
                {
                        thread->remaining_tick --;
                }
        }
其中rt_thread_priority_table的[0][1][31]链表元素是指向实体的rt_thread线程控制块(rt_flag1_thread,rt_flag2_thread以及空闲线程控制块idle),而其他的元素则指向当前链表元素本身,并没有实体的线程控制块作为元素的.next指向,因此其他元素在计算thread的首地址的的时候,会获取到一个不可预料的地址,那么thread->remaining_tick的值也是一个不可预料的值,对thread->remaining_tick做--操作,就是对一个不可预料的位置里面存放的值做了--操作,如果获取的这个地址恰巧指向我们程序中需要使用到的地址,就有可能引发不可预料的结果。
在程序实际运行的过程中,可以看到rt_thread_priority_table[5~31]的prev的值一直在变。虽然没有引起程序崩溃(程序运行现象是正确的),至少不是预期的反应,而且这样的做法个人认为不是很安全。不知道讲的对不对,请大家指正。
回复

使用道具 举报

发表于 2019-5-23 08:45:55 | 显示全部楼层
帮顶
回复

使用道具 举报

发表于 2019-5-23 09:20:27 | 显示全部楼层
首先,你要明白火哥这样子写的用意是什么,为了什么目的,其次你要对比在实际应用上的源码是怎么样的,

第一,这是软件仿真的程序,火哥为什么这样子写,是因为阻塞延时用到了这个 thread->remaining_tick   ;[mw_shl_code=c,true]void rt_thread_delay(rt_tick_t tick)
{
    struct rt_thread *thread;   
   
    /* 获取当前线程的线程控制块 */   
    thread = rt_current_thread;
   
    /* 设置延时时间 */
    thread->remaining_tick = tick;
       
        /* 进行系统调度 */
        rt_schedule();
}[/mw_shl_code]
是为了方便延时,所以在更新时基的时候对所有的任务控制块进行 -- 操作,没做某个控制块判断也是问题所在,但是这个工程本身就是为了给大家参考思路的,无法下载到芯片运行。。

在rtt源码上实现的方式如下:
阻塞延时:
[mw_shl_code=c,true]rt_err_t rt_thread_sleep(rt_tick_t tick)
{
    register rt_base_t temp;
    struct rt_thread *thread;

    /* disable interrupt */
    temp = rt_hw_interrupt_disable();
    /* set to current thread */
    thread = rt_current_thread;
    RT_ASSERT(thread != RT_NULL);

    /* suspend thread */
    rt_thread_suspend(thread);

    /* reset the timeout of thread timer and start it */
    rt_timer_control(&(thread->thread_timer), RT_TIMER_CTRL_SET_TIME, &tick);
    rt_timer_start(&(thread->thread_timer));

    /* enable interrupt */
    rt_hw_interrupt_enable(temp);

    rt_schedule();

    /* clear error number of this thread to RT_EOK */
    if (thread->error == -RT_ETIMEOUT)
        thread->error = RT_EOK;

    return RT_EOK;
}[/mw_shl_code]

更新时基:
[mw_shl_code=c,true]void rt_tick_increase(void)
{
    struct rt_thread *thread;

    /* increase the global tick */
    ++ rt_tick;

    /* check time slice */
    thread = rt_thread_self();

    -- thread->remaining_tick;
    if (thread->remaining_tick == 0)
    {
        /* change to initialized tick */
        thread->remaining_tick = thread->init_tick;

        /* yield */
        rt_thread_yield();
    }

    /* check timer */
    rt_timer_check();
}[/mw_shl_code]

回复 支持 反对

使用道具 举报

发表于 2019-5-28 10:51:38 | 显示全部楼层
本帖最后由 q8606318 于 2019-5-29 10:49 编辑

借个楼问一下各位大神,算了不借楼了,我另外发个帖子了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-30 22:10:13 | 显示全部楼层
本帖最后由 Taizi091019 于 2019-5-30 22:30 编辑
杰杰 发表于 2019-5-23 09:20
首先,你要明白火哥这样子写的用意是什么,为了什么目的,其次你要对比在实际应用上的源码是怎么样的,

...

感谢您的回复,但是不得不说,你没看明白我的意思,火哥的用意我懂,但是这样的操作我个人认为确实不安全,当thread没有实体化的时候,对thread->remaining_tick直接做减减操作,并不是很安全。我并没有说这个代码要实际应用,而只是对这个操作本身而言,个人认为不是很严谨,因为很多人都是初学,个人只是把认为不是很严谨的问题发出来,让大家有个更清晰的认识,哪怕说的是错的,最起码给了大家更多的分辨的角度。非常感谢您的回复,虽然我还是觉得您没有理解我说的意思,可能是我的表达有问题,我的意思仅仅是这样操作不安全。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-31 01:02:14 来自手机 | 显示全部楼层
杰杰 发表于 2019-5-23 09:20
首先,你要明白火哥这样子写的用意是什么,为了什么目的,其次你要对比在实际应用上的源码是怎么样的,

...

帖子里面有人提到,把tlist成员放在stack_size程序后面,第9个例程就无法正常运行,就是我上面说的问题导致的,减减操作前加上判断列表元素非空就解决了。
回复 支持 反对

使用道具 举报

发表于 2019-5-31 14:06:03 | 显示全部楼层
Taizi091019 发表于 2019-5-31 01:02
帖子里面有人提到,把tlist成员放在stack_size程序后面,第9个例程就无法正常运行,就是我上面说的问题导 ...

回复 支持 反对

使用道具 举报

发表于 2019-6-27 17:35:44 | 显示全部楼层
哪里有例程呀,求一个,来分析。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-28 08:41:14 | 显示全部楼层
火哥的F429挑战者开发板配套资料,论坛里面有链接
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-21 20:01 , Processed in 0.028922 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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