维库电子市场网
登录 免费注册 首页 | 行业黑名单 | 委托交易 | 帮助 | English
 
IC供应
IC求购
非IC供应
非IC求购
电子资讯
技术资料
商人论坛
 
技术文章 PDF资料 IC价格 引脚说明 电路图 IC替换 IC厂商 电子辞典
作者 主题 内容
采购元器件好去处--维库电子市场网推荐
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统
驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe

请大侠看看俺的程序任务或者信号量哪出问题了,多谢啦

来源:21ic 作者:aMonster 栏目:ARM技术
请大侠看看俺的程序任务或者信号量哪出问题了,多谢啦
    我试着更改EASYARM2100中UCOS2下的GPIO程序,原程序是两个任务,一个优先级为0,一开始就挂起自身;一个优先级为10,不断检测按键,当按键按下时恢复任务0。我加了一个任务,优先级为9,即整个系统功能为按下KEY1和KEY2都恢复任务0。一开始没有使用信号量,想让任务0和任务9都出现延时的时候任务10运行,但是不行;后来使用信号量,只有任务9一直运行,任务10没有运行。
    请各位大侠看看俺的程序,主要是任务设定和信号量有没有问题,多谢了!
    程序如下:
/**************************************************************
**--------------文件信息-----------------------------------------
**文   件   名: test.c
**描        述: μCOS-II上的LPC210x的通用IO使用的例子,在EasyArm2100板              上调试通过
*************************************************************/

#include "config.h"  

#define  TASK_STK_SIZE       128

OS_STK   TaskStartStk[TASK_STK_SIZE];
OS_STK   TaskStk[TASK_STK_SIZE];
OS_STK   Task2Stk[TASK_STK_SIZE];
OS_EVENT   *GpioSem;                  /* P153 事件控制块 */

#define      KEY1    (1 << 16)             /* P0.16为KEY1 */
#define   KEY2  (1 << 17)             /* P0.17为KEY2 */

#define      BEEP    (1 << 7)              /* P0.7为蜂鸣器 */

void TaskStart(void *data);
void Task(void *data);
void Task2(void *data);
/**************************************************************
** 函数名称: main
** 功能描述: c语言的主函数,由它启动多任务环境
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: OSInit,OSTaskCreate,OSStart
**********************************************************/
int main (void)
{
    OSInit();
    
    GpioSem = OSSemCreate(1);              /* 创建信号量 P166 */

    OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 0);   //P117
    
    OSStart();
    
    return 0;
}

/***********************************************************
** 函数名称: TaskStart
** 功能描述: μCOS-II的第一个任务,通常由它初始化目标板和建立其它任务
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块:
**************************************************************/
void  TaskStart(void *pdata)
{
    pdata = pdata;                           /* 避免编译警告 */

    TargetInit();                          /* 目标板初始化 */
    IO0DIR &= ~(KEY1||KEY2);                                        /* 设置KEY1为输入*/
    IO0SET = BEEP;
    IO0DIR |= BEEP;                                     /* 设置蜂鸣器为输出*/
    PINSEL0 = (PINSEL0 & 0xffff3fff);                               /* 管脚选择模块初始化 */
    PINSEL1 = (PINSEL1 & 0xfffffffc);
    
    OSTaskCreate(Task, (void *)0, &TaskStk[TASK_STK_SIZE - 1], 10);                        /* 创建任务 Task     */
    OSTaskCreate(Task2, (void *)0, &TaskStk[TASK_STK_SIZE - 1], 9);                         /* 创建任务 Task2    */

    while(1)
    {
        OSTaskSuspend(OS_PRIO_SELF);         //P138,挂起任务
        
        IO0CLR = BEEP;
        OSTimeDly(OS_TICKS_PER_SEC / 2);     //  OS_TICKS_PER_SEC 为 一秒,在 OS_CFG.H 中定义
        
        IO0SET = BEEP;
        OSTimeDly(OS_TICKS_PER_SEC / 1);

        IO0CLR = BEEP;
        OSTimeDly(OS_TICKS_PER_SEC / 8);
        
        IO0SET = BEEP;
        OSTimeDly(OS_TICKS_PER_SEC / 4);
    }
}

/**********************************************************
** 函数名称: Task
** 功能描述: μCOS-II的任务
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块:
***********************************************************/
void  Task(void *pdata)
{
    uint8 err;
     
    pdata = pdata;                          /* 避免编译警告 */
   

    while(1)
    {
        OSSemPend(GpioSem, 0, &err);   /* 等待一个信号量 P171   */
        
        OSTimeDly(OS_TICKS_PER_SEC / 50);      /* 延时20毫秒 */
        if ((IO0PIN & KEY1) != 0)
        {
            continue;
        }
        OSTimeDly(OS_TICKS_PER_SEC / 50);      /* 延时20毫秒 */
        if ((IO0PIN & KEY1) != 0)
        {
       &nb
1楼: >>参与讨论
aMonster
找到一处,TASK2的堆栈设错了
 
2楼: >>参与讨论
aMonster
IO口功能选择模块定义错了。
改了以后,不用信号量没问题了。但是按照原来程序里面的信号量还是调不出来。请高手指教!

* - 本贴最后修改时间:2004-12-11 16:46:43 修改者:aMonster

3楼: >>参与讨论
yangrf0422
任务10得不到信号量
当主任务挂起后,优先级高的任务9得到信号量而运行,如果KEY2不按下,信号量是不会置位的,即不运行OSSemPost(GpioSem),也就是说,此时信号量是0,即使任务10得到信号量也只能等待; 如果KEY2按下,信号量置位后,主任务得到运行。蜂鸣后,主任务又挂起。又是 优先级高的任务9运行,而任务10因为无法得到信号量而一直等待。
这是我个人的理解。不对请更正。         


参与讨论
昵称:
讨论内容:
 
 
相关帖子
请ZLG的工程师或各位高手帮忙
求助:请问我自己做的2104的板子有问题
请教关于外部中断边沿触发的问题
IODIR自己怎么变了?
自己做的2104的板子,p0.14_p44不管是否接地都可下载flash


Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号