本帖最后由 会飞的猪_2020 于 2024-11-18 16:41 编辑
互斥锁用于互斥。
信号量用于任务间同步。
刚才试了一下,xSemaphoreCreateMutex创建互斥量之后,内置的计数值应该是1。
也就是说下面这个伪代码,tcp_client_test还是会执行。
[C] 纯文本查看 复制代码
void main(void) {
....
ip_mutex = xSemaphoreCreateMutex();
....
}
static void _init(void *p)
{
log_i("task wifi init");
while (1) {
if (xSemaphoreTake(ip_mutex, portMAX_DELAY) == pdTRUE) {
extern int tcp_client_test(void);
tcp_client_test();
}
}
}
而改成xSemaphoreCreateBinary之后,它内部的计数值应该是0了。就不会直接执行了。

感觉互斥量不应该用于任务之间同步,应该用于保护共享的资源。
例如下面这个保护同一个串口发送。
[C] 纯文本查看 复制代码 /**
* @brief 串口发送
* @param {COM_PORT_E} _ucPort
* @param {uint8_t} *_ucaBuf
* @param {uint16_t} _usLen
* @return {*}
*/
int32_t comSendBuf(COM_PORT_E _ucPort, uint8_t *_ucaBuf, uint16_t _usLen)
{
UART_T *pUart;
int ret = 0;
pUart = ComToUart(_ucPort);
if (pUart == 0) {
return -1;
}
xSemaphoreTake(pUart->mutex, portMAX_DELAY);
if (pUart->SendBefor != NULL) {
pUart->SendBefor(pUart->com);
}
ret = hosal_uart_send(pUart->uart, _ucaBuf, _usLen);
hosal_uart_ioctl(pUart->uart, HOSAL_UART_FLUSH, NULL); //阻塞发送
if (pUart->SendOver != NULL) {
pUart->SendOver(pUart->com);
}
xSemaphoreGive(pUart->mutex);
return ret;
}
|