初级会员
- 积分
- 60
- 金钱
- 60
- 注册时间
- 2016-9-5
- 在线时间
- 10 小时
|
1金钱
实现效果:
定时1接收信号量、刷新LED,
任务1扫描按键、发送信号量;
创建:软件定时器1,Task1,消息对象KEY_Msg;
问题:
软件定时中查询信号量 err == OS_ERR_PEND_WOULD_BLOCK;
是不是软件定时中断中不能使用信号量,或者是,我使用方法不对?请高手指点,谢谢!
//-------------------------------------------------------------------
//-------------------------------启动开始任务-------------------------
//-------------------------------------------------------------------
#define START_TASK_PRIO 3 //任务优先级
#define START_STK_SIZE 64 //任务堆栈大小
OS_TCB StartTaskTCB; //任务控制块
CPU_STK START_TASK_STK[START_STK_SIZE]; //任务堆栈
void start_task(void *p_arg); //任务函数
//-------------------------------------------------------------------
//-------------------------------任务1------------------------------
//-------------------------------------------------------------------
#define TASK1_TASK_PRIO 4 //任务优先级
#define TASK1_STK_SIZE 64 //任务堆栈大小
OS_TCB Task1_TaskTCB; //任务控制块
CPU_STK TASK1_TASK_STK[TASK1_STK_SIZE]; //任务堆栈
void task1_task(void *p_arg); //任务函数
//-------------------------------------------------------------------
//-------------------------------软件定时----------------------------
//-------------------------------------------------------------------
OS_TMR tmr1; //定时器1
void tmr1_callback(void *p_tmr, void *p_arg); //定时器1回调函数
//-------------------------------------------------------------------
//-------------------------------信号量-------------------------------
//-------------------------------------------------------------------
OS_SEM MY_SEM; //定义一个信号量,用于访问共享资源
//定时器1的回调函数
void tmr1_callback(void *p_tmr,void *p_arg)
{
OS_ERR err;
OSSemPend(&MY_SEM,0,OS_OPT_PEND_BLOCKING,0,&err); //请求信号量
if(PAout(1)==1)
PAout(1)=0;
else
PAout(1)=1;
}
//任务1的任务函数
void task1_task(void *p_arg)
{
OS_ERR err;
u8 key;
key = KEY_Scan(0); //扫描按键
if(key==WKUP_PRES)
{
OSSemPost(&MY_SEM,OS_OPT_POST_ALL,&err);//发送信号量
}
OSTimeDlyHMSM(0,0,0,10,OS_OPT_TIME_PERIODIC,&err); //延时10ms
}
|
|