搜索
bottom↓
回复: 5

rt_semaphore的问题

[复制链接]

出0入0汤圆

发表于 2010-12-12 16:55:17 | 显示全部楼层 |阅读模式
看了RT-Thread3.0的编程指南,信号量那一节里有一个环形buffer的读写并显示的历程。
就两个线程 一个读出来显示,一个写进去
BUFFER_ITEM是32
UART1循环输出来的是不是应该是一个32个数据?
我的理解:
线程worker等待可用信号量 把32字节的BUFFER写到working_buffer里
线程thread等待可用信号量 从working_buffer里出去32字节的BUFFER显示出来。
可是结果是:UART上只是循环输出0X0D和0X0A两个数据。
求高手帮忙解释下,顺便能给我提点下对信号量的理解那就最好了。谢谢!

线程如下:(具体程序基本和RT-Thread3.0的编程指南7.3节信号量里循环BUFFER那个例程程序一样)
static void thread_entry(void* parameter)
{
    rt_bool_t result;
    rt_uint8_t index,data_buffer[BUFFER_ITEM];

    while(1)
    {
        rt_sem_take(&sem,RT_WAITING_FOREVER);
        result = rb_get(&working_rb,&data_buffer[0],BUFFER_ITEM);
        rt_sem_release(&sem);

        if(result==RT_TRUE)
        {
             rt_kprintf("%s\n",data_buffer);
        }
        rt_thread_delay(RT_TICK_PER_SECOND);
    }
}

static void worker_entry(void* parameter)
{
    rt_bool_t result;
    rt_uint32_t index,setchar;
    rt_uint8_t data_buffer[BUFFER_ITEM];

    setchar=0x21;
    while(1)
    {
        for(index=0;index<BUFFER_ITEM;index++)
        {
            data_buffer[index]=setchar;
            if(++setchar==0x7f)
                setchar=0x21;
//            rt_kprintf("%d\n",index);

        }
        rt_sem_take(&sem,RT_WAITING_FOREVER);
        result=rb_put(&working_rb,&data_buffer[0],BUFFER_ITEM);
        rt_sem_release(&sem);
        rt_thread_delay(10);
    }
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2010-12-13 07:34:02 | 显示全部楼层
svn trunk\examples\kernel\semaphore_buffer_worker.c即这个例程,你可以直接下载下来试试。

以下是我在QEMU(虚拟的mini2440分支)中运行这个例子的结果:

(原文件名:rb_semaphore.jpg)


这个例子本身依然存在一些问题,因为是写入32字节字串,读出32字节字串,从而少了后面的结束符号。

出0入0汤圆

发表于 2010-12-13 07:35:30 | 显示全部楼层
改成如下代码,加一个字串终结符
/* 生产者线程入口 */
static void thread_entry(void* parameter)
{
        rt_bool_t result;
        rt_uint8_t data_buffer[BUFFER_ITEM + 1];

        while (1)
        {
                /* 持有信号量 */
                rt_sem_take(sem, RT_WAITING_FOREVER);
                /* 从环buffer中获得数据 */
                result = rb_get(&working_rb, &data_buffer[0], BUFFER_ITEM);
                /* 释放信号量 */
                rt_sem_release(sem);
                data_buffer[BUFFER_ITEM] = '\0';

                if (result == RT_TRUE)
                {
                        /* 获取数据成功,打印数据 */
                        rt_kprintf("%s\n", data_buffer);
                }

                /* 做一个5 OS Tick的休眠 */
                rt_thread_delay(5);
        }
}

加了后,后面的输出就正确了。

出0入0汤圆

 楼主| 发表于 2010-12-13 09:55:10 | 显示全部楼层
我已经解决了问题,你说的字符串结束符的问题我也发现了。。谢谢

出0入0汤圆

 楼主| 发表于 2010-12-13 11:19:10 | 显示全部楼层
回复【1楼】ffxz
-----------------------------------------------------------------------

这个例程不用信号量 是不是也没有影响正常功能的实现的??

出0入0汤圆

发表于 2010-12-13 13:43:23 | 显示全部楼层
回复【4楼】hduxyc  许耀聪
回复【1楼】ffxz
-----------------------------------------------------------------------
这个例程不用信号量 是不是也没有影响正常功能的实现的??
-----------------------------------------------------------------------

在这里,sempahore是起了一个锁的作用,为了保证ring buffer的一致性,这个锁是必须的。

虽然这个锁可以是其他的,例如中断锁,信号量锁,互斥锁,调度锁等。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 11:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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