struct LcdDevice *init_lcd(const char *device) { //申请空间 struct LcdDevice* lcd = malloc(sizeof(struct LcdDevice)); if(lcd == NULL) { return NULL; } //1打开设备 lcd->fd = open(device, O_RDWR); if(lcd->fd < 0) { perror("open lcd fail"); free(lcd); return NULL; } //映射 lcd->mp = mmap(NULL,800*480*4,PROT_READ|PROT_WRITE,MAP_SHARED,lcd->fd,0); return lcd; }
时间: 2024-04-27 18:22:39 浏览: 25
这段代码是一个初始化`LcdDevice`结构体的函数,函数名为`init_lcd`,它接受一个字符串类型的设备路径参数`device`。函数首先申请一块内存空间,大小为`struct LcdDevice`结构体的大小,并将该内存空间的指针赋值给指针变量`lcd`。如果申请内存空间失败,函数会返回`NULL`。
接下来,函数会尝试打开设备文件,如果打开失败,函数会输出错误信息,并释放之前申请的内存空间,最后返回`NULL`。
如果设备文件打开成功,函数会调用`mmap`函数将设备文件映射到内存空间中,并将映射后的内存空间的指针赋值给`mp`成员变量,然后返回`lcd`指针。
需要注意的是,函数中申请的内存空间需要在使用完毕后,调用`free`函数释放,否则会出现内存泄漏的问题。
相关问题
优化struct LcdDevice *init_lcd(const char *device) { //申请空间 struct LcdDevice* lcd = malloc(sizeof(struct LcdDevice)); if(lcd == NULL) { return NULL; } //1打开设备 lcd->fd = open(device, O_RDWR); if(lcd->fd < 0) { perror("open lcd fail"); free(lcd); return NULL; } //映射 lcd->mp = mmap(NULL,800*480*4,PROT_READ|PROT_WRITE,MAP_SHARED,lcd->fd,0); return lcd; }
这段代码已经相对简洁,但是还可以进一步优化。下面是一些可能的优化方案:
1. 检查`open`和`mmap`函数的返回值,如果返回值小于0,直接返回`NULL`。
2. 将所有的指针变量初始化为`NULL`,这样可以避免释放未分配的内存空间。
3. 在函数结束时,检查指针变量是否为`NULL`,如果不是,则释放该指针变量指向的内存空间。
根据上述方案,下面是一个优化后的代码示例:
```c
struct LcdDevice *init_lcd(const char *device) {
// 初始化所有指针变量为NULL
struct LcdDevice *lcd = NULL;
void *mp = NULL;
// 申请内存空间
lcd = malloc(sizeof(struct LcdDevice));
if (lcd == NULL) {
return NULL;
}
// 打开设备文件
lcd->fd = open(device, O_RDWR);
if (lcd->fd < 0) {
perror("open lcd fail");
goto fail;
}
// 映射设备文件到内存空间中
mp = mmap(NULL, 800 * 480 * 4, PROT_READ | PROT_WRITE, MAP_SHARED, lcd->fd, 0);
if (mp == MAP_FAILED) {
perror("mmap lcd fail");
goto fail;
}
// 将映射后的内存空间的指针赋值给mp成员变量
lcd->mp = mp;
// 函数正常返回
return lcd;
fail:
// 出现错误时,释放所有已经分配的内存空间
if (lcd != NULL) {
free(lcd);
}
if (mp != NULL) {
munmap(mp, 800 * 480 * 4);
}
return NULL;
}
```
在这个优化后的代码中,使用了`goto`语句来实现错误处理的跳转,以减少重复代码的数量。同时,在函数结束时,检查指针变量是否为`NULL`,如果不是,则释放该指针变量指向的内存空间,避免了可能出现的内存泄漏问题。
对以下代码进行注释并给出可复制代码static int bl_tp_send_indicate(struct bt_conn *conn, const struct bt_gatt_attr *attr, const void *data, u16_t len) { struct bt_gatt_indicate_params *ind_params = k_malloc(sizeof(struct bt_gatt_indicate_params)); ind_params->attr = attr; ind_params->data = data; ind_params->len = len; ind_params->func = indicate_rsp; ind_params->uuid = NULL; return bt_gatt_indicate(conn, ind_params); } struct bt_gatt_attr *get_attr(u8_t index) { return &attrs[index]; } struct bt_gatt_service ble_tp_server = BT_GATT_SERVICE(attrs); void ble_tp_init() { if( !isRegister ) { isRegister = 1; bt_conn_cb_register(&ble_tp_conn_callbacks); bt_gatt_service_register(&ble_tp_server); } }
// 定义一个发送 Indicate 的函数,参数为连接、属性、数据和长度
static int bl_tp_send_indicate(struct bt_conn *conn, const struct bt_gatt_attr *attr, const void *data, u16_t len) {
// 创建一个 GATT Indicate 参数结构体并初始化
struct bt_gatt_indicate_params *ind_params = k_malloc(sizeof(struct bt_gatt_indicate_params));
ind_params->attr = attr; // 设置属性
ind_params->data = data; // 设置数据
ind_params->len = len; // 设置数据长度
ind_params->func = indicate_rsp; // 设置回调函数
ind_params->uuid = NULL; // 设置 UUID 为空
// 调用 bt_gatt_indicate 函数发送 Indicate 请求,并返回结果
return bt_gatt_indicate(conn, ind_params);
}
// 定义一个获取属性的函数,参数为属性的索引
struct bt_gatt_attr *get_attr(u8_t index) {
return &attrs[index]; // 返回属性指针
}
// 定义一个 BLE GATT 服务,参数为属性数组
struct bt_gatt_service ble_tp_server = BT_GATT_SERVICE(attrs);
// 初始化 BLE GATT 服务
void ble_tp_init() {
// 如果还没有注册
if (!isRegister) {
isRegister = 1; // 设置已注册标记为 1
bt_conn_cb_register(&ble_tp_conn_callbacks); // 注册连接回调函数
bt_gatt_service_register(&ble_tp_server); // 注册 GATT 服务
}
}
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.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)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)