QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2584|回复: 5

请教,ucos 中互斥信号量的使用问题

[复制链接]
发表于 2005-6-27 10:35:23 | 显示全部楼层 |阅读模式
以下代码是修改ucos_test, 其中用到互斥信号量,却一直进入不了Task2,请教原因?
/*   
*  hello.c
*  this file implement start_kernel and irqhandler
*  for Atmel AT91 operating system
*
*  Bugs report:     li ming  ( [email protected] )
*  Last modified:   2003-02-02
*
*/

#include "skyeye_stdio.h"
#include "includes.h"
#include "at91_init.h"

//yangye (OSTickISR -> OSISR)
extern void OSISR(void);
void Sleep(INT16U uSec);
void Task1(void * pParam);
void Task2(void * pParam);
extern void  OSTimeTick(void);

#define        N_TASKS                        3        // Number of tasks
#define        TASK_STK_SIZE        1024                // Stack size, in sizeof OS_STK, or int 32bit
OS_STK        TaskStk[N_TASKS][TASK_STK_SIZE];        // Tasks stacks
char    s[200];
char    tmp[200];

// OS_EVENT *sem1;
OS_EVENT *ResourceMutex;

/* start_kernel entry */
void start_kernel(void)
{
        int i;
        int task_1 = 1;
        int task_2 = 2;

        for (i=0; i<7; i++) {
                s = 'a';
        }

        s[7] = '\n';

        /* firstly, we should install irq mode handler, must call do_irq in any user's handler  */
        install_irqhandler(OSISR);
        //yangye
        request_irq(5,OSTimeTick);

        OSInit();

        OSTaskCreate(Task1, &task_1, &TaskStk[0][TASK_STK_SIZE-1], 5);
        OSTaskCreate(Task2, &task_2, &TaskStk[1][TASK_STK_SIZE-1], 6);
       
        OSStart();
}

/* Task1 get_user_input */
void Task1(void * pParam)
{
        unsigned char err;

        at91_init();
       
        //sem1 = OSSemCreate(0);
        ResourceMutex = OSMutexCreate(4, &err);       
       
        while (1)
        {
                skyeye_printf( "Task1 running... Please input a string:> " );
                skyeye_gets(s);
                // OSSemPend(sem1,10,(void*)0);
                OSMutexPend(ResourceMutex, 0, &err);
                skyeye_printf("aaaaaaaaaaa");
                OSMutexPost(ResourceMutex);
        }
}

/* Task2 print_user_input */
void Task2(void * pParam)
{               
        unsigned char err;

        while(1)       
        {
                skyeye_printf( "Task2 running... Your input string: \"%s\"\n", s );
                OSMutexPend(ResourceMutex, 0, &err);       
                //OSSemPost(sem1);
                OSMutexPost(ResourceMutex);
        }
}

/* call system delay function */
void Sleep(INT16U uSec)
{
        OSTimeDly((INT16U) (uSec) * 10);
}
发表于 2005-6-28 11:26:37 | 显示全部楼层
看来需要自己多琢磨!
回复

使用道具 举报

 楼主| 发表于 2005-7-2 11:46:04 | 显示全部楼层
谢谢班主提示
回复

使用道具 举报

发表于 2005-7-4 16:53:57 | 显示全部楼层
楼主在你的任务1和任务2的最后各加一个OSTimeDly(10)试试看?
建议楼主再看看上面这个函数的源代码,这样对搞清楚ucos多任务实现的原理是有帮助的。
回复

使用道具 举报

发表于 2005-7-4 20:02:14 | 显示全部楼层
[quote:014bba112e="WWaNN"]楼主在你的任务1和任务2的最后各加一个OSTimeDly(10)试试看?
建议楼主再看看上面这个函数的源代码,这样对搞清楚ucos多任务实现的原理是有帮助的。[/quote]
说错了,这个函数应该是加在while(1)循环体的最后位置。
回复

使用道具 举报

发表于 2005-7-6 13:35:39 | 显示全部楼层
原来的信号量可以正确运行么? 对于信号量劭贝贝老师那本书后面有很好的例子可以参考。
回复

使用道具 举报

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

本版积分规则

GMT+8, 2024-11-5 01:57 , Processed in 0.103476 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

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