|
| 采购元器件好去处--维库电子市场网推荐 |
| 技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | 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 于 2004-12-11 16:04:00 发布:
找到一处,TASK2的堆栈设错了 |
|
| 2楼: | >>参与讨论 |
| 作者: aMonster 于 2004-12-11 16:34:00 发布:
IO口功能选择模块定义错了。 改了以后,不用信号量没问题了。但是按照原来程序里面的信号量还是调不出来。请高手指教! * - 本贴最后修改时间:2004-12-11 16:46:43 修改者:aMonster |
|
| 3楼: | >>参与讨论 |
| 作者: yangrf0422 于 2004-12-14 9:20:00 发布:
任务10得不到信号量 当主任务挂起后,优先级高的任务9得到信号量而运行,如果KEY2不按下,信号量是不会置位的,即不运行OSSemPost(GpioSem),也就是说,此时信号量是0,即使任务10得到信号量也只能等待; 如果KEY2按下,信号量置位后,主任务得到运行。蜂鸣后,主任务又挂起。又是 优先级高的任务9运行,而任务10因为无法得到信号量而一直等待。 这是我个人的理解。不对请更正。 |
|
|
|
Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号 |