OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4307|回复: 2

freertos二值信号量删除重建

[复制链接]

16

主题

90

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
368
金钱
368
注册时间
2019-10-24
在线时间
153 小时
发表于 2022-2-28 11:05:26 | 显示全部楼层 |阅读模式
20金钱
void malloc_task(void *pvParameters)
{
  BaseType_t err1=pdFALSE;      
        while(1)
        {
                if(ifd_socket2->tcppcb->BinarySemaphore!=NULL)
                {
                        err1=xSemaphoreTake(ifd_socket2->tcppcb->BinarySemaphore,portMAX_DELAY);        //获取信号量
                        if(err1==pdTRUE)               
                        {
                                //TCP1网口发送和接收
                                ifd_socket2->Send(SocketType_TcpClient,tcp_client_send,30);
                                Receive_resu=ifd_socket2->Recevie(SocketType_TcpClient,Tcp_Receive);

                                HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_1);
                                vTaskDelay(10);               
                        }      
                }
        }
}
这一段任务函数运行正常(二值信号是在接收回调函数释放的)
while(1)
{
   if(ifd_socket2->tcppcb->state==CLOSED)
  {      
      vSemaphoreDelete(ifd_socket2->tcppcb->BinarySemaphore);                       
      ifd_socket2->Close_Connect(ifd_socket2->tcppcb,SocketType_TcpClient);               
      res_tcp=ifd_socket2->Creat(SocketType_TcpClient,0,0);
      if(res_tcp == 0)
      {
        vSemaphoreDelete(ifd_socket2->tcppcb->BinarySemaphore);      
        ifd_socket2->tcppcb->BinarySemaphore=xSemaphoreCreateBinary();        //创建TCP2二值信号
        res_concet=ifd_socket2->Connect(SocketType_TcpClient,Set_remoteip,TCP_CLIENT_PORT);      
      }

   }
}
这里添加了一段重连机制,TCP删除重建->连接都没问题,但此时二值信号已经无效,二值信号删前删后地址一致
typedef void *  flag_turn;
while(1)
{
   if(ifd_socket2->tcppcb->state==CLOSED)
  {      
      flag_turn=ifd_socket2->tcppcb->BinarySemaphore;            //先提取信号地址      
      ifd_socket2->Close_Connect(ifd_socket2->tcppcb,SocketType_TcpClient);               
      res_tcp=ifd_socket2->Creat(SocketType_TcpClient,0,0);
      if(res_tcp == 0)
      {
        ifd_socket2->tcppcb->BinarySemaphore=xSemaphoreCreateBinary();        //创建TCP2二值信号
        ifd_socket2->tcppcb->BinarySemaphore=flag_turn;     //把删tcp块前的信号地址再赋给新建的信号值
        res_concet=ifd_socket2->Connect(SocketType_TcpClient,Set_remoteip,TCP_CLIENT_PORT);      
      }
   }
}

这一段试验二值信号有效,第二段和第三段的二值信号地址一致,为什么第二段无效呢,求解

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

14

主题

821

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2070
金钱
2070
注册时间
2021-7-17
在线时间
647 小时
发表于 2022-2-28 11:18:11 | 显示全部楼层
回复

使用道具 举报

16

主题

90

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
368
金钱
368
注册时间
2019-10-24
在线时间
153 小时
 楼主| 发表于 2022-2-28 11:32:31 | 显示全部楼层
“假设有任务堵塞在这个信号量上,则这个信号量不要删除”
不太理解这句话,即便是有任务堵塞在这个信号量上,那么我如果删除重建,再去释放信号量,那任务是不是照样执行呢
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 03:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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