size_t data_size = Min(ESP_RAM_BLOCK, remain_size);中的Min有什么作用
时间: 2024-04-25 17:23:52 浏览: 27
引用[2]中的代码段展示了一个名为`tlsf_malloc`的函数,其中包含了一个`adjust_request_size`函数。根据代码中的注释,`adjust_request_size`函数的作用是将请求的内存大小向上对齐到4字节的倍数。这个函数的返回值被赋值给`adjust`变量,然后用于查找最合适的空闲内存块。所以,`Min`函数在这里的作用是将`ESP_RAM_BLOCK`和`remain_size`中的较小值赋给`data_size`变量,以确保请求的内存大小不会超过可用的内存大小。
相关问题
USART_SendData()这个函数是怎么写的
USART_SendData()函数是芯片厂商提供的库函数之一,用于向USART发送单个字节的数据。其函数定义通常包含两个参数:USARTx代表USART端口号,Data表示要发送的数据。
以下是STM32HAL库中USART_SendData()函数的代码:
```
void HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
{
uint16_t* tmp = (uint16_t*) pData;
uint32_t tickstart = HAL_GetTick();
huart->TxXferSize = Size;
huart->TxXferCount = Size;
/* Check the remain data to be sent */
while(huart->TxXferCount > 0U)
{
/* Wait until TXE flag is set to send data */
if(UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK)
{
return HAL_TIMEOUT;
}
/* Send data with format Data, par, stop */
if(huart->Init.WordLength == UART_WORDLENGTH_9B)
{
huart->Instance->TDR = (*tmp & (uint16_t)0x01FF);
tmp++;
}
else
{
huart->Instance->TDR = (*pData++ & (uint8_t)0xFF);
}
huart->TxXferCount--;
}
/* Wait until TC flag is set to close transmission */
if(UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TC, RESET, tickstart, Timeout) != HAL_OK)
{
return HAL_TIMEOUT;
}
/* Clear TXE flag */
__HAL_UART_CLEAR_FLAG(huart, UART_FLAG_TC);
/* Process Unlocked */
__HAL_UNLOCK(huart);
return HAL_OK;
}
```
在此函数中,首先通过tickstart变量记录当前时间,定义了TxXferSize和TxXferCount变量来表示要发送的数据的大小和剩余的数据量。然后在while循环中,判断TxXferCount是否大于0,即是否还有数据未发送。如果TXE标志位被设置,则可以发送数据。在发送数据之前,如果使用了9位字长,则从pData指向的地址中取出9个bit,然后再将其写入TDR寄存器。否则,直接将pData指向的8个bit写入TDR寄存器。最后,等待数据发送完毕,并清除TC标志位。
需要注意的是,USART_SendData()函数在发送数据之前必须调用USART_Init()函数初始化串口参数,确保参数设置正确。
cfg80211_remain_on_channel代码具体实现
cfg80211_remain_on_channel函数的具体实现代码如下:
```
int cfg80211_remain_on_channel(struct wiphy *wiphy,
struct net_device *dev,
struct ieee80211_channel *chan,
unsigned int duration,
u64 *cookie)
{
struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
struct cfg80211_roc_request *roc_req;
int err;
if (!rdev->ops->remain_on_channel)
return -EOPNOTSUPP;
roc_req = kzalloc(sizeof(*roc_req), GFP_KERNEL);
if (!roc_req)
return -ENOMEM;
roc_req->cookie = get_wiphy_cookie(wiphy);
roc_req->wdev = dev_to_wdev(dev);
roc_req->chan = chan;
roc_req->duration = duration;
roc_req->aborted = false;
roc_req->wait = wait_event_interruptible(rdev->roc_wait, roc_req->aborted);
if (roc_req->wait < 0) {
/* user cancelled */
kfree(roc_req);
return roc_req->wait;
}
err = rdev_remain_on_channel(rdev, roc_req);
if (err) {
kfree(roc_req);
return err;
}
*cookie = roc_req->cookie;
return 0;
}
```
在此实现中,首先检查设备是否支持ROC功能。如果不支持,则返回-EOPNOTSUPP。如果支持ROC,则会创建一个新的cfg80211_roc_request结构体,该结构体用于保存ROC请求信息。然后,会将ROC请求添加到设备的ROC请求列表中,并调用驱动程序的remain_on_channel函数启动ROC操作。最后,会等待ROC操作完成,并将ROC请求从设备的ROC请求列表中删除。
需要注意的是,实际的ROC操作是由驱动程序完成的,因此具体的实现方式可能会因不同的硬件平台而有所不同。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)