Task 04

数学函数及逻辑函数

向量化和广播
向量化和广播这两个概念是 numpy 内部实现的基础。有了向量化,编写代码时无需使用显式循环。这些循环实际上不能省略,只不过是在内部实现,被代码中的其他结构代替。向量化的应用使得代码更简洁,可读性更强,也可以说使用了向量化方法的代码看上去更“Pythonic”。
广播(Broadcasting)机制描述了 numpy 如何在算术运算期间处理具有不同形状的数组,让较小的数组在较大的数组上“广播”,以便它们具有兼容的形状。并不是所有的维度都要彼此兼容才符合广播机制的要求,但它们必须满足一定的条件。
若两个数组的各维度兼容,也就是两个数组的每一维等长,或其中一个数组为 一维,那么广播机制就适用。如果这两个条件不满足,numpy就会抛出异常,说两个数组不兼容。

总结来说,广播的规则有三个:
如果两个数组的维度数dim不相同,那么小维度数组的形状将会在左边补1;
如果shape维度不匹配,但是有维度是1,那么可以扩展维度是1的维度匹配另一个数组;
如果shape维度不匹配,但是没有任何一个维度是1,则匹配引发错误。

  #  二维数组加一维数组
import numpy as np

x = np.arange(4)
y = np.ones((3, 4))
print(x.shape)  
print(y.shape)  
print()
print((x + y).shape)
pritn() 
print(x + y)
#  (4,)
#  (3, 4)

#  (3, 4)

#  [[1. 2. 3. 4.]
#   [1. 2. 3. 4.]
#   [1. 2. 3. 4.]]
  #  两个数组均需要广播
import numpy as np

x = np.arange(4).reshape(4, 1)
y = np.ones(5)

print(x.shape)  
print(y.shape)  
print((x + y).shape)
print()
print(x + y)
print()
x = np.array([0.0, 10.0, 20.0, 30.0])
y = np.array([1.0, 2.0, 3.0])
z = x[:, np.newaxis] + y
print(z)
#  (4, 1)
#  (5,)
#  (4, 5)

#  [[1. 1. 1. 1. 1.]
#   [2. 2. 2. 2. 2.]
#   [3. 3. 3. 3. 3.]
#   [4. 4. 4. 4. 4.]]

#  [[ 1.  2.  3.]
#   [11. 12. 13.]
#   [21. 22. 23.]
#   [31. 32. 33.]]

算数运算
numy.add(x1, x2, *args, **kwargs) # 加
numpy.subtract(x1, x2, *args, **kwargs) # 减
numpy.multiply(x1, x2, *args, **kwargs) # 乘
numpy.divide(x1, x2, *args, **kwargs)
numpy.floor_divide(x1, x2, *args, **kwargs)
numpy.power(x1, x2, *args, **kwargs)
在 numpy 中对以上函数进行了运算符的重载,且运算符为 元素级。也就是说,它们只用于位置相同的元素之间,所得到的运算结果组成一个新的数组。

#  numpy的广播规则
import numpy as np

x = np.array([1, 2, 3, 4, 5, 6, 7, 8])
y = x + 1
print(y)
print(np.add(x, 1))
print()
y = x - 1
print(y)
print(np.subtract(x, 1))
print()
y = x * 2
print(y)
print(np.multiply(x, 2))
print()
y = x / 2
print(y)
print(np.divide(x, 2))
print()
y = x // 2
print(y)
print(np.floor_divide(x, 2))
print()
y = x ** 2
print(y)
print(np.power(x, 2))
#  [2 3 4 5 6 7 8 9]
#  [2 3 4 5 6 7 8 9]

#  [0 1 2 3 4 5 6 7]
#  [0 1 2 3 4 5 6 7]

#  [ 2  4  6  8 10 12 14 16]
#  [ 2  4  6  8 10 12 14 16]

#  [0.5 1.  1.5 2.  2.5 3.  3.5 4. ]
#  [0.5 1.  1.5 2.  2.5 3.  3.5 4. ]

#  [0 1 1 2 2 3 3 4]
#  [0 1 1 2 2 3 3 4]

#  [ 1  4  9 16 25 36 49 64]
#  [ 1  4  9 16 25 36 49 64]

numpy.sqrt(x, *args, **kwargs)
numpy.square(x, *args, **kwargs)

import numpy as np

x = np.arange(1, 5)
print(x) 
print()
y = np.sqrt(x)
print(y)
print()
print(np.power(x, 0.5))
print()
y = np.square(x)
print(y)
print()
print(np.power(x, 2))
#  [1 2 3 4]

#  [1.         1.41421356 1.73205081 2.        ]

#  [1.         1.41421356 1.73205081 2.        ]

#  [ 1  4  9 16]

#  [ 1  4  9 16]

三角函数
numpy.sin(x, *args, **kwargs)
numpy.cos(x, *args, **kwargs)
numpy.tan(x, *args, **kwargs)
numpy.arcsin(x, *args, **kwargs)
numpy.arccos(x, *args, **kwargs)
numpy.arctan(x, *args, **kwargs)
通用函数(universal function)通常叫作ufunc,它对数组中的各个元素逐一进行操作。这表明,通用函数分别处理输入数组的每个元素,生成的结果组成一个新的输出数组。输出数组的大小跟输入数组相同。
三角函数等很多数学运算符合通用函数的定义,例如,计算平方根的sqrt()函数、用来取对数的log()函数和求正弦值的sin()函数。

import numpy as np

x = np.linspace(start=0, stop=np.pi / 2, num=10)
print(x)
print()
y = np.sin(x)
print(y)
print()
z = np.arcsin(y)
print(z)
print()
y = np.cos(x)
print(y)
print()
z = np.arccos(y)
print(z)
print()
y = np.tan(x)
print(y)
print()
z = np.arctan(y)
print(z)
#  [0.         0.17453293 0.34906585 0.52359878 0.6981317  0.87266463
#   1.04719755 1.22173048 1.3962634  1.57079633]

#  [0.         0.17364818 0.34202014 0.5        0.64278761 0.76604444
#   0.8660254  0.93969262 0.98480775 1.        ]

#  [0.         0.17453293 0.34906585 0.52359878 0.6981317  0.87266463
#   1.04719755 1.22173048 1.3962634  1.57079633]

#  [1.00000000e+00 9.84807753e-01 9.39692621e-01 8.66025404e-01
#   7.66044443e-01 6.42787610e-01 5.00000000e-01 3.42020143e-01
#   1.73648178e-01 6.12323400e-17]

#  [0.         0.17453293 0.34906585 0.52359878 0.6981317  0.87266463
#   1.04719755 1.22173048 1.3962634  1.57079633]

#  [0.00000000e+00 1.76326981e-01 3.63970234e-01 5.77350269e-01
#   8.39099631e-01 1.19175359e+00 1.73205081e+00 2.74747742e+00
#   5.67128182e+00 1.63312394e+16]

#  [0.         0.17453293 0.34906585 0.52359878 0.6981317  0.87266463
#   1.04719755 1.22173048 1.3962634  1.57079633]

指数和对数
numpy.exp(x, *args, **kwargs)
numpy.log(x, *args, **kwargs)
numpy.exp2(x, *args, **kwargs)
numpy.log2(x, *args, **kwargs)
numpy.log10(x, *args, **kwargs)

import numpy as np

x = np.arange(1, 5)
print(x)
print()
y = np.exp(x)
print(y)
print()
z = np.log(y)
print(z)
#  [1 2 3 4]

#  [ 2.71828183  7.3890561  20.08553692 54.59815003]

#  [1. 2. 3. 4.]

加法函数、乘法函数
numpy.sum(a[, axis=None, dtype=None, out=None, …])
通过不同的 axis,numpy 会沿着不同的方向进行操作:如果不设置,那么对所有的元素操作;如果axis=0,则沿着纵轴进行操作;axis=1,则沿着横轴进行操作。但这只是简单的二位数组,如果是多维的呢?可以总结为一句话:设axis=i,则 numpy 沿着第i个下标变化的方向进行操作。
numpy.cumsum(a, axis=None, dtype=None, out=None)
聚合函数 是指对一组值(比如一个数组)进行操作,返回一个单一值作为结果的函数。因而,求数组所有元素之和的函数就是聚合函数。ndarray类实现了多个这样的函数。

  #  返回给定轴上的数组元素的总和
import numpy as np

x = np.array([[11, 12, 13, 14, 15],
              [16, 17, 18, 19, 20],
              [21, 22, 23, 24, 25],
              [26, 27, 28, 29, 30],
              [31, 32, 33, 34, 35]])
y = np.sum(x)
print(y)  
print()
y = np.sum(x, axis=0)
print(y)
print()
y = np.sum(x, axis=1)
print(y)
#  575

#  [105 110 115 120 125]

#  [ 65  90 115 140 165]
#  返回定轴上的数组元素累加和
import numpy as np

x = np.array([[11, 12, 13, 14, 15],
              [16, 17, 18, 19, 20],
              [21, 22, 23, 24, 25],
              [26, 27, 28, 29, 30],
              [31, 32, 33, 34, 35]])
y = np.cumsum(x)
print(y)
print()
y = np.cumsum(x, axis=0)
print(y)
print()
y = np.cumsum(x, axis=1)
print(y)
[ 11  23  36  50  65  81  98 116 135 155 176 198 221 245 270 296 323 351
 380 410 441 473 506 540 575]

#  [[ 11  12  13  14  15]
#   [ 27  29  31  33  35]
#   [ 48  51  54  57  60]
#   [ 74  78  82  86  90]
#   [105 110 115 120 125]]

#  [[ 11  23  36  50  65]
#   [ 16  33  51  70  90]
#   [ 21  43  66  90 115]
#   [ 26  53  81 110 140]
#   [ 31  63  96 130 165]]

numpy.prod(a[, axis=None, dtype=None, out=None, …]) # 乘积
numpy.cumprod(a, axis=None, dtype=None, out=None) # 累乘

#  返回给定轴上数组元素的乘积
import numpy as np

x = np.array([[11, 12, 13, 14, 15],
              [16, 17, 18, 19, 20],
              [21, 22, 23, 24, 25],
              [26, 27, 28, 29, 30],
              [31, 32, 33, 34, 35]])
y = np.prod(x)
print(y)  
print()
y = np.prod(x, axis=0)
print(y)
print()
y = np.prod(x, axis=1)
print(y)
#  788529152

#  [2978976 3877632 4972968 6294624 7875000]

#  [  360360  1860480  6375600 17100720 38955840]
  #  返回给定轴上数组元素的累乘
import numpy as np

x = np.array([[11, 12, 13, 14, 15],
              [16, 17, 18, 19, 20],
              [21, 22, 23, 24, 25],
              [26, 27, 28, 29, 30],
              [31, 32, 33, 34, 35]])
y = np.cumprod(x)
print(y)
print()
y = np.cumprod(x, axis=0)
print(y)
print()
y = np.cumprod(x, axis=1)
print(y)
#  [         11         132        1716       24024      360360     #  5765760
#      98017920  1764322560  -837609728   427674624   391232512    #  17180672
#     395155456   893796352   870072320  1147043840   905412608  #  -418250752
#     755630080  1194065920 -1638662144  -897581056   444596224 #  -2063597568
#     788529152]


#  [[     11      12      13      14      15]
#   [    176     204     234     266     300]
#   [   3696    4488    5382    6384    7500]
#   [  96096  121176  150696  185136  225000]
#   [2978976 3877632 4972968 6294624 7875000]]

#  [[      11      132     1716    24024   360360]
#   [      16      272     4896    93024  1860480]
#   [      21      462    10626   255024  6375600]
#   [      26      702    19656   570024 17100720]
#   [      31      992    32736  1113024 38955840]]

numpy.diff(a, n=1, axis=-1, prepend=np._NoValue, append=np._NoValue) # 差值
a:输入矩阵.
n:可选,代表要执行几次差值.
axis:默认是最后一个.

沿着指定轴计算第N维的离散差值
import numpy as np

A = np.arange(2, 14).reshape((3, 4))
A[1, 1] = 8
print(A)
print()
print(np.diff(A))
print()
print(np.diff(A, axis=0))
#  [[ 2  3  4  5]
#   [ 6  8  8  9]
#   [10 11 12 13]]

#  [[1 1 1]
#   [2 0 1]
#   [1 1 1]]

#  [[4 5 4 4]
#   [4 3 4 4]]

四舍五入
numpy.around(a, decimals=0, out=None) # 舍入

import numpy as np

x = np.random.rand(3, 3) * 10
print(x)
print()
y = np.around(x)
print(y)
print()
y = np.around(x, decimals=2)
print(y)
[[6.21405305 3.9502371  5.99466005]
 [8.41636019 0.36589317 0.29549992]
 [9.68230437 5.19238791 2.31586774]]

[[ 6.  4.  6.]
 [ 8.  0.  0.]
 [10.  5.  2.]]

#  [[6.21 3.95 5.99]
#   [8.42 0.37 0.3 ]
#   [9.68 5.19 2.32]]

numpy.ceil(x, *args, **kwargs) # 上限
numpy.floor(x, *args, **kwargs) # 下限

import numpy as np

x = np.random.rand(3, 3) * 10
print(x)
print()
y = np.ceil(x)
print(y)
print()
y = np.floor(x)
print(y)
[[6.21132493 6.22116606 1.30223519]
 [6.75712874 3.79677817 2.14575888]
 [7.16364242 4.04178689 9.35675049]]

#  [[ 7.  7.  2.]
#   [ 7.  4.  3.]
#   [ 8.  5. 10.]]

#  [[6. 6. 1.]
#   [6. 3. 2.]
#   [7. 4. 9.]]

杂项
numpy.clip(a, a_min, a_max, out=None, **kwargs) # 裁剪

import numpy as np

x = np.array([[11, 12, 13, 14, 15],
              [16, 17, 18, 19, 20],
              [21, 22, 23, 24, 25],
              [26, 27, 28, 29, 30],
              [31, 32, 33, 34, 35]])
y = np.clip(x, a_min=20, a_max=30)
print(y)
#  [[20 20 20 20 20]
#   [20 20 20 20 20]
#   [21 22 23 24 25]
#   [26 27 28 29 30]
#   [30 30 30 30 30]]

numpy.absolute(x, *args, **kwargs) # 绝对值
numpy.abs(x, *args, **kwargs)

import numpy as np

x = np.arange(-5, 5)
print(x)
print()
y = np.abs(x)
print(y)
print()
y = np.absolute(x)
print(y)
#  [-5 -4 -3 -2 -1  0  1  2  3  4]

#  [5 4 3 2 1 0 1 2 3 4]

#  [5 4 3 2 1 0 1 2 3 4]

numpy.sign(x, *args, **kwargs) # 返回数字符号的逐元素指示

x = np.arange(-5, 5)
print(x)
print()
print(np.sign(x))
#  [-5 -4 -3 -2 -1  0  1  2  3  4]

#  [-1 -1 -1 -1 -1  0  1  1  1  1]
内容概要:本文详细介绍了“秒杀商城”微服务架构的设计与实战全过程,涵盖系统从需求分析、服务拆分、技术选型到核心功能开发、分布式事务处理、容器化部署及监控链路追踪的完整流程。重点解决了高并发场景下的超卖问题,采用Redis预减库存、消息队列削峰、数据库乐观锁等手段保障数据一致性,并通过Nacos实现服务注册发现与配置管理,利用Seata处理跨服务分布式事务,结合RabbitMQ实现异步下单,提升系统吞吐能力。同时,项目支持Docker Compose快速部署和Kubernetes生产级编排,集成Sleuth+Zipkin链路追踪与Prometheus+Grafana监控体系,构建可观测性强的微服务系统。; 适合人群:具备Java基础和Spring Boot开发经验,熟悉微服务基本概念的中高级研发人员,尤其是希望深入理解高并发系统设计、分布式事务、服务治理等核心技术的开发者;适合工作2-5年、有志于转型微服务或提升架构能力的工程师; 使用场景及目标:①学习如何基于Spring Cloud Alibaba构建完整的微服务项目;②掌握秒杀场景下高并发、超卖控制、异步化、削峰填谷等关键技术方案;③实践分布式事务(Seata)、服务熔断降级、链路追踪、统一配置中心等企业级中间件的应用;④完成从本地开发到容器化部署的全流程落地; 阅读建议:建议按照文档提供的七个阶段循序渐进地动手实践,重点关注秒杀流程设计、服务间通信机制、分布式事务实现和系统性能优化部分,结合代码调试与监控工具深入理解各组件协作原理,真正掌握高并发微服务系统的构建能力。
/* USER CODE BEGIN Header */ /** ****************************************************************************** * File Name : freertos.c * Description : Code for freertos applications ****************************************************************************** * @attention * * Copyright (c) 2025 STMicroelectronics. * All rights reserved. * * This software is licensed under terms that can be found in the LICENSE file * in the root directory of this software component. * If no LICENSE file comes with this software, it is provided AS-IS. * ****************************************************************************** */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "FreeRTOS.h" #include "task.h" #include "main.h" #include "cmsis_os.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM */ /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ /* USER CODE BEGIN Variables */ /* USER CODE END Variables */ osThreadId HighTaskHandle; osThreadId MedTaskHandle; osThreadId LowTaskHandle; osThreadId myTask04Handle; osMutexId myMutex01Handle; osSemaphoreId myBinarySem01Handle; /* Private function prototypes -----------------------------------------------*/ /* USER CODE BEGIN FunctionPrototypes */ /* USER CODE END FunctionPrototypes */ void StartDefaultHighTask(void const * argument); void StartMedTask(void const * argument); void StartLowTask(void const * argument); void StartTask04(void const * argument); void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) */ /* GetIdleTaskMemory prototype (linked to static allocation support) */ void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize ); /* USER CODE BEGIN GET_IDLE_TASK_MEMORY */ static StaticTask_t xIdleTaskTCBBuffer; static StackType_t xIdleStack[configMINIMAL_STACK_SIZE]; void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize ) { *ppxIdleTaskTCBBuffer = &xIdleTaskTCBBuffer; *ppxIdleTaskStackBuffer = &xIdleStack[0]; *pulIdleTaskStackSize = configMINIMAL_STACK_SIZE; /* place for user code */ } /* USER CODE END GET_IDLE_TASK_MEMORY */ /** * @brief FreeRTOS initialization * @param None * @retval None */ void MX_FREERTOS_Init(void) { /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Create the mutex(es) */ /* definition and creation of myMutex01 */ osMutexDef(myMutex01); myMutex01Handle = osMutexCreate(osMutex(myMutex01)); /* USER CODE BEGIN RTOS_MUTEX */ /* add mutexes, ... */ /* USER CODE END RTOS_MUTEX */ /* Create the semaphores(s) */ /* definition and creation of myBinarySem01 */ osSemaphoreDef(myBinarySem01); myBinarySem01Handle = osSemaphoreCreate(osSemaphore(myBinarySem01), 1); /* USER CODE BEGIN RTOS_SEMAPHORES */ /* add semaphores, ... */ /* USER CODE END RTOS_SEMAPHORES */ /* USER CODE BEGIN RTOS_TIMERS */ /* start timers, add new ones, ... */ /* USER CODE END RTOS_TIMERS */ /* USER CODE BEGIN RTOS_QUEUES */ /* add queues, ... */ /* USER CODE END RTOS_QUEUES */ /* Create the thread(s) */ /* definition and creation of HighTask */ osThreadDef(HighTask, StartDefaultHighTask, osPriorityHigh, 0, 128); HighTaskHandle = osThreadCreate(osThread(HighTask), NULL); /* definition and creation of MedTask */ osThreadDef(MedTask, StartMedTask, osPriorityNormal, 0, 128); MedTaskHandle = osThreadCreate(osThread(MedTask), NULL); /* definition and creation of LowTask */ osThreadDef(LowTask, StartLowTask, osPriorityLow, 0, 128); LowTaskHandle = osThreadCreate(osThread(LowTask), NULL); /* definition and creation of myTask04 */ osThreadDef(myTask04, StartTask04, osPriorityIdle, 0, 128); myTask04Handle = osThreadCreate(osThread(myTask04), NULL); /* USER CODE BEGIN RTOS_THREADS */ /* add threads, ... */ /* USER CODE END RTOS_THREADS */ } /* USER CODE BEGIN Header_StartDefaultHighTask */ /** * @brief Function implementing the HighTask thread. * @param argument: Not used * @retval None */ /* USER CODE END Header_StartDefaultHighTask */ void StartDefaultHighTask(void const * argument) { /* USER CODE BEGIN StartDefaultHighTask */ /* Infinite loop */ for(;;) { printf("HighPriority_Task Relasing semaphore!\r\n"); osSemaphoreRelease (myBinarySem01Handle); // osSemaphoreRelease (myMutex01Handle); vTaskDelay (500); osDelay(1); } /* USER CODE END StartDefaultHighTask */ } /* USER CODE BEGIN Header_StartMedTask */ /** * @brief Function implementing the MedTask thread. * @param argument: Not used * @retval None */ /* USER CODE END Header_StartMedTask */ void StartMedTask(void const * argument) { /* USER CODE BEGIN StartMedTask */ /* Infinite loop */ for(;;) { printf("MidPriority_Task Runing \r\n"); vTaskDelay (500); osDelay(1); } /* USER CODE END StartMedTask */ } /* USER CODE BEGIN Header_StartLowTask */ /** * @brief Function implementing the LowTask thread. * @param argument: Not used * @retval None */ /* USER CODE END Header_StartLowTask */ void StartLowTask(void const * argument) { /* USER CODE BEGIN StartLowTask */ /* Infinite loop */ static uint32_t i; for(;;) { printf("LowPriority_Task gets binarySem! \r\n"); if(osSemaphoreWait(myBinarySem01Handle, osWaitForever )== osOK ) { printf("LowPriority_Task Runing \r\n"); } // if(osSemaphoreWait(myMutex01Handle, osWaitForever )== osOK ) // { // printf("LowPriority_Task Runing \r\n"); // } for (i=0;i<2000000;i++) { osThreadYield (); } printf("LowPriority_Task Relasing semaphore!\r\n"); osSemaphoreRelease (myBinarySem01Handle); // osSemaphoreRelease (myMutex01Handle); vTaskDelay (500); osDelay(1); } /* USER CODE END StartLowTask */ } /* USER CODE BEGIN Header_StartTask04 */ /** * @brief Function implementing the myTask04 thread. * @param argument: Not used * @retval None */ /* USER CODE END Header_StartTask04 */ void StartTask04(void const * argument) { /* USER CODE BEGIN StartTask04 */ /* Infinite loop */ for(;;) { if (osMutexWait(myMutex01Handle, osWaitForever) == osOK) { printf("myTask04 acquired mutex and is running\r\n"); vTaskDelay(pdMS_TO_TICKS(200)); osMutexRelease(myMutex01Handle); printf("myTask04 released mutex\r\n"); } else { printf("myTask04 failed to acquire mutex\r\n"); } vTaskDelay(pdMS_TO_TICKS(500)); osDelay(1); } /* USER CODE END StartTask04 */ } /* Private application code --------------------------------------------------*/ /* USER CODE BEGIN Application */ /* USER CODE END Application */该程序输出结果是什么
06-08
### 回答问题 该程序是一个基于FreeRTOS的多任务系统,定义了四个任务:`HighTask`、`MedTask`、`LowTask` 和 `myTask04`。这些任务通过互斥量(`myMutex01Handle`)和二进制信号量(`myBinarySem01Handle`)来协调它们的行为。 #### 程序逻辑分析 1. **HighTask**: - 每隔500ms释放一次二进制信号量`myBinarySem01Handle`。 - 输出消息: ``` HighPriority_Task Relasing semaphore! ``` 2. **MedTask**: - 每隔500ms打印一条消息。 - 输出消息: ``` MidPriority_Task Runing ``` 3. **LowTask**: - 尝试获取二进制信号量`myBinarySem01Handle`,如果成功,则运行一段代码并释放信号量。 - 输出消息: ``` LowPriority_Task gets binarySem! LowPriority_Task Runing LowPriority_Task Relasing semaphore! ``` 4. **myTask04**: - 尝试获取互斥量`myMutex01Handle`,如果成功,则运行一段代码并释放互斥量。 - 输出消息: ``` myTask04 acquired mutex and is running myTask04 released mutex ``` #### 输出结果分析 假设系统启动后,任务按照优先级调度(`HighTask` > `MedTask` > `LowTask` > `myTask04`),以下是可能的输出结果: 1. **初始状态**: - `HighTask`首先运行,并释放信号量,打印: ``` HighPriority_Task Relasing semaphore! ``` 2. **MidPriority_Task**: - `MedTask`每500ms运行一次,并打印: ``` MidPriority_Task Runing ``` 3. **LowPriority_Task**: - 当`LowTask`获取到信号量时,它会打印: ``` LowPriority_Task gets binarySem! LowPriority_Task Runing LowPriority_Task Relasing semaphore! ``` 4. **myTask04**: - 当`myTask04`获取到互斥量时,它会打印: ``` myTask04 acquired mutex and is running myTask04 released mutex ``` #### 综合输出示例 假设系统启动后,可能的综合输出如下: ``` HighPriority_Task Relasing semaphore! MidPriority_Task Runing LowPriority_Task gets binarySem! LowPriority_Task Runing LowPriority_Task Relasing semaphore! myTask04 acquired mutex and is running myTask04 released mutex HighPriority_Task Relasing semaphore! MidPriority_Task Runing LowPriority_Task gets binarySem! LowPriority_Task Runing LowPriority_Task Relasing semaphore! myTask04 acquired mutex and is running myTask04 released mutex ``` ### 解释 1. **任务优先级**: - 任务按照优先级调度:`HighTask` > `MedTask` > `LowTask` > `myTask04`。 - 高优先级任务会抢占低优先级任务的CPU时间。 2. **信号量行为**: - 二进制信号量`myBinarySem01Handle`用于控制`LowTask`的执行。只有当`HighTask`释放信号量时,`LowTask`才能获取信号量并运行。 3. **互斥量行为**: - 互斥量`myMutex01Handle`用于保护共享资源。`myTask04`在获取互斥量后才能访问共享资源,并在完成后释放互斥量。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值