野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 4716|回复: 2

有关于任务信号量的一个问题

[复制链接]
发表于 2017-3-4 19:53:59 | 显示全部楼层 |阅读模式
在中断里,调用任务信号量  给 AppTaskTest1TCB,发送一个任务信号量

那可不可以再次建立一个中断,也是调用任务信号量,只不过给另一个任务  AppTaskTest2TCB

这样它们会相互干扰吗?
回复

使用道具 举报

 楼主| 发表于 2017-3-4 20:14:52 | 显示全部楼层
经过我的尝试和不断修改,初步完成了CAN的通讯实验,在这里给大家分享一下代码把,希望对大家有用,然后大家也多都提改进意见

/*-----------------------------------------------------------一下是CAN的两个任务,一个接收一个发送-------------------------------------------------------------------------------------*/

static  void  AppTaskCANRx ( void * p_arg )
{
        OS_ERR         err;
  uint8_t i;
        CPU_SR_ALLOC();

       
        (void)p_arg;



       
        while (DEF_TRUE) {                                  //任务体
                /* 阻塞任务,直到KEY1被单击 */
                OSTaskSemPend ((OS_TICK   )0,                     //无期限等待
                                                                         (OS_OPT    )OS_OPT_PEND_BLOCKING,  //如果信号量不可用就等待
                                                                         (CPU_TS   *)0,                     //获取信号量被发布的时间戳
                                                                         (OS_ERR   *)&err);                 //返回错误类型


                OS_CRITICAL_ENTER();                              //进入临界段,避免串口打印被打断
   
                printf ( "接收到的数据ID为:\r\n0x%x\r\n接受到的数据为:",ExID);      
     for(i=0;i<8;i++)
                {printf("%3x",CAN1_data[i]);}               
                printf("\n\r");
                OS_CRITICAL_EXIT();                               //退出临界段
               
        }
       
}




static void  AppTaskCANTx  (void * p_arg )
{ uint8_t i;
        OS_ERR err;
        CPU_SR_ALLOC();
       
       
        (void )p_arg;
       
        while(DEF_TRUE)
        {
                        OSTaskSemPend((OS_TICK   )0,                     //无期限等待
                                                                         (OS_OPT    )OS_OPT_PEND_BLOCKING,  //如果信号量不可用就等待
                                                                         (CPU_TS   *)0,                     //获取信号量被发布的时间戳
                                                                         (OS_ERR   *)&err);                 //返回错误类型
       
       
        CAN_SetMsg(&TxMessage);
         
        CAN_Transmit(CANx,&TxMessage);
               
        OS_CRITICAL_ENTER();
               
                printf("\r\n需要发送的数据ID为:0x%x\n\r发送的数据为:",TxMessage.ExtId);
        for(i=0;i<8;i++)
                {
                        printf("%3x",TxMessage.Data[i]);
                }
                printf("\n\r");
        OS_CRITICAL_EXIT();
        }
}

/*---------------------------------------------------------------------以下是两个中断服务函数,第一个是接受CAN通道,第二个是按键------------------------------------------------------------------------------------------- */

extern uint8_t CAN1_data[8];
extern uint32_t ExID;
extern OS_TCB         AppTaskCANRxTCB;


void macCAN_RX_IRQHandler(void)
{ uint8_t i;
        OS_ERR   err;
        CanRxMsg RxMessage;

       
       
        OSIntEnter();                                              //进入中断
       
        /* 从内存分区 mem 获取一个内存块 */

  CAN_Receive(CANx, CAN_FIFO0, &RxMessage);
          
        ExID = RxMessage.ExtId;
  for(i = 0;i < 8;i ++)
  {

    CAN1_data[i] = RxMessage.Data[i];

   }
   

    CAN_ClearITPendingBit(CAN1,CAN_IT_FMP0); /* 清除挂起中断 */
       

          OSTaskSemPost((OS_TCB  *)&AppTaskCANRxTCB,   //目标任务
                                                                        (OS_OPT   )OS_OPT_POST_NONE, //没选项要求
                                                                        (OS_ERR  *)&err);            //返回错误类型               

       
       
        OSIntExit();                                               //退出中断
       
}


extern OS_TCB         AppTaskCANTxTCB;

void macEXTI_INT_FUNCTION(void)
{
        OS_ERR   err;
       
       
        OSIntEnter();                                      //进入中断
       
        if(EXTI_GetITStatus(macEXTI_LINE) != RESET)  //确保是否产生了EXTI Line中断
        {
                /* 发送任务信号量到任务 AppTaskKey */
                OSTaskSemPost((OS_TCB  *)&AppTaskCANTxTCB,   //目标任务
                                                                        (OS_OPT   )OS_OPT_POST_NONE, //没选项要求
                                                                        (OS_ERR  *)&err);            //返回错误类型               

                EXTI_ClearITPendingBit(macEXTI_LINE);      //清除中断标志位
        }  
       
        OSIntExit();                                       //退出中断
}


有不足的地方多多指正!
回复 支持 反对

使用道具 举报

发表于 2018-6-8 21:17:25 | 显示全部楼层
两个不同的信号量任务,分别发布,两个不同的任务分别等待会有什么干扰呢?
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-5-29 11:53 , Processed in 0.031905 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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