zoukankan      html  css  js  c++  java
  • STM32CubeIDE+FreeRTOS二值信号量实验

    创建工程RTOS_BinarySem,

    配置HCLK,使用内部晶振,频率为180MHZ(根据板子设置)

    将SYS中时基源(Timebase Source)改为除SysTick之外的任意定时器即可,如:

     配置FreeRTOS,使用CMSIS_V1,先定义两个任务,一个是myTask_Wait,负责等待二值信号量,获取成功后打印输出提示信息。另一个是myTask_Release,负责释放二值信号量,每隔2秒释放一次。

        

     在添加一个二值信号量,如图:

    Ctrl + S生成代码

    修改代码,

    1,在main.h中添加

    /* Private includes ----------------------------------------------------------*/
    /* USER CODE BEGIN Includes */
    #include "stdio.h"
    /* USER CODE END Includes */

    2,在mian.c中添加

    /* USER CODE BEGIN PFP */
    int _write(int file , char *ptr,int len)
    {
        int i = 0;
        for(i = 0;i<len;i++)
            ITM_SendChar((*ptr++));
        return len;
    }
    /* USER CODE END PFP */
    
    ...
    ...
    ...
    
    /* USER CODE BEGIN 2 */
    printf("starting...
    ");
    /* USER CODE END 2 */

    3,在main.c中修改3个任务入口函数的内容

    /* USER CODE BEGIN Header_StartDefaultTask */
    /**
      * @brief  Function implementing the defaultTask thread.
      * @param  argument: Not used 
      * @retval None
      */
    /* USER CODE END Header_StartDefaultTask */
    void StartDefaultTask(void const * argument)
    {
      /* USER CODE BEGIN 5 */
        int timeCount = 1;
      /* Infinite loop */
      for(;;)
      {
        printf("DefaultTask----time   %d
    ",timeCount++);
        osDelay(1000);
      }
      /* USER CODE END 5 */ 
    }
    /* USER CODE BEGIN Header_StartTaskWait */
    /**
    * @brief Function implementing the myTask_Wait thread.
    * @param argument: Not used
    * @retval None
    */
    /* USER CODE END Header_StartTaskWait */
    void StartTaskWait(void const * argument)
    {
      /* USER CODE BEGIN StartTaskWait */
      /* Infinite loop */
      for(;;)
      {
          osSemaphoreWait(myBinarySem01Handle, osWaitForever);
          printf("I get BinarySemaphore.
    ");
      }
      /* USER CODE END StartTaskWait */
    }
    /* USER CODE BEGIN Header_StartTaskRelease */
    /**
    * @brief Function implementing the myTask_Release thread.
    * @param argument: Not used
    * @retval None
    */
    /* USER CODE END Header_StartTaskRelease */
    void StartTaskRelease(void const * argument)
    {
      /* USER CODE BEGIN StartTaskRelease */
      /* Infinite loop */
      for(;;)
      {
        osDelay(2000);
        osSemaphoreRelease(myBinarySem01Handle);
      }
      /* USER CODE END StartTaskRelease */
    }

    修改完毕后点击 小锤子 构建工程,然后点击Debug,按如下步骤配置ITM调试

     

     全速运行之前一定要先点击SWV ITM data Console 页面中的红色圆圈

    现象:

     分析

    DefaultTask 负责每秒输出一个当前的时间信息,表示此时时间为第几秒。

    TaskWait负责等待二值信号量,如果获取不到,就一直等待,如果和获取成功,输出提示信息。

    TaskRelease等待2秒释放二值信号量。

    可以看到,I get BinarySemaphore.提示信息2秒钟出现一次,成功。

    实现了不同任务间二值信号量的获取与释放

  • 相关阅读:
    【AHOI2009】 维护序列
    Codeforces Hello 2019 F. Alex and a TV Show[bitset+莫比乌斯反演]
    Codeforces Hello 2019 D. Makoto and a Blackboard[DP+数论+概率期望]
    Codeforces Hello 2019 ABCDF题解
    [BZOJ1042][HAOI2008]硬币购物[容斥原理+背包]
    Codeforces Round #529 (Div. 3)题解
    [BZOJ4311]向量[线段树分治+计算几何+二分/三分]
    [BZOJ1076][SCOI2008]奖励关[状压DP+概率期望]
    [POJ3368][UVA11235] Frequent values[ST表]
    [USACO5.5]矩形周长Picture[扫描线+线段树]
  • 原文地址:https://www.cnblogs.com/tianxxl/p/12020743.html
Copyright © 2011-2022 走看看