新手谈C指针02__int *p=NULL、*p=NULL、*(int *)0x0018ff44.

这篇博客探讨了C语言中指针变量初始化为NULL(0)的含义,强调了NULL、0与ASCII码为0的空字符NUL之间的区别。作者解释了指针变量P存储地址0x00000000的情况,并指出编译器只能检查语法错误,不能确保程序在所有情况下都能正常运行。文章还讨论了尝试向未知地址写入内容的风险,并提醒读者注意计算机内存的访问限制。
int  *p = NULL;

此语句什么意思?没错,就是定义了一个整型指针变量P,并进行了初始化。

那么,现在有个问题。它初始化了什么东西?NULL?

NULL又是什么?(这里需要注意)

NULL是被宏定义成 0 。即为 define   NULL  0 

很多系统下除了NULL之外,还有NUL(VC++6.0上提示说不认识NUL。error C2065: 'NUL' : undeclared identifier )NUL是ASCII码表的第一个字符,表示的是空字符,其ASCII码值为0;虽然都为0,但表示的意思完全不一样。同样,NULL和0表示的意思也完全不一样。一定不要混淆。


既然我们知道NULL是0,就是说指针变量P初始化为0了。

在前一篇新手谈C指针01_指针?中我们已经说过,指针变量内任何数据都会被当作地址进行处理。所以,P 里存储的是地址0x00000000。而不是把 *p 里的内容初始化为0。

其实,在上一篇博文也提到了。我们可以把 int * 看成一个整体,这时候变量就是P,而不是

(gdb) bt #0 lv_obj_get_ext_draw_size (obj=obj@entry=0x0) at /home/xiejikai/24q3/torchlight/build_dir/target-arm-openwrt-linux-uclibcgnueabihf/nvrgui_lvgl/lvgl/src/core/lv_obj_draw.c:313 #1 0x0004f490 in lv_obj_invalidate (obj=obj@entry=0x0) at /home/xiejikai/24q3/torchlight/build_dir/target-arm-openwrt-linux-uclibcgnueabihf/nvrgui_lvgl/lvgl/src/core/lv_obj_pos.c:847 #2 0x0002fc50 in lv_label_set_text (obj=0x0, text=0xbeeca03c "2025-11-12") at /home/xiejikai/24q3/torchlight/build_dir/target-arm-openwrt-linux-uclibcgnueabihf/nvrgui_lvgl/lvgl/src/widgets/label/lv_label.c:147 #3 0x000c9ebe in tp_lv_time_picker_set_show_time_only (obj=0x4dfd4c <work_mem_int+2506536>, time=<optimized out>) at TpTimePicker.c:341 #4 0x0014d274 in update_time_str_label (obj=obj@entry=0x460324 <work_mem_int+1983744>) at PlaybackBar.c:3961 #5 0x001514b4 in tp_lv_timebar_event_cb (class_p=<optimized out>, e=<optimized out>) at PlaybackBar.c:2268 #6 tp_lv_timebar_event_cb (class_p=<optimized out>, e=<optimized out>) at PlaybackBar.c:2216 #7 0x000481cc in lv_obj_event_base (class_p=<optimized out>, e=e@entry=0xbeeca2ac) at /home/xiejikai/24q3/torchlight/build_dir/target-arm-openwrt-linux-uclibcgnueabihf/nvrgui_lvgl/lvgl/src/core/lv_obj_event.c:89 #8 0x00048242 in event_send_core (e=e@entry=0xbeeca2ac) at /home/xiejikai/24q3/torchlight/build_dir/target-arm-openwrt-linux-uclibcgnueabihf/nvrgui_lvgl/lvgl/src/core/lv_obj_event.c:364 #9 0x0004833e in lv_obj_send_event (obj=<optimized out>, event_code=<optimized out>, param=param@entry=0x0) at /home/xiejikai/24q3/torchlight/build_dir/target-arm-openwrt-linux-uclibcgnueabihf/nvrgui_lvgl/lvgl/src/core/lv_obj_event.c:67 #10 0x001edc4c in playbackimp_chn_list_change_task_cb (task=<optimized out>) at PlaybackImp.c:689 #11 0x001a53cc in async_task_finish_process (arg=0x3d3bb8 <work_mem_int+1408404>) at TpAsyncTaskQueue.c:994 #12 0x001c45e2 in tp_sync_timer (timer=<optimized out>) at AppInit.c:757 #13 0x0003fadc in lv_timer_exec (timer=0x3aff24 <work_mem_int+1261824>) at /home/xiejikai/24q3/torchlight/build_dir/target-arm-openwrt-linux-uclibcgnueabihf/nvrgui_lvgl/lvgl/src/misc/lv_timer.c:326 #14 lv_timer_handler () at /home/xiejikai/24q3/torchlight/build_dir/target-arm-openwrt-linux-uclibcgnueabihf/nvrgui_lvgl/lvgl/src/misc/lv_timer.c:107 #15 lv_timer_handler () at /home/xiejikai/24q3/torchlight/build_dir/target-arm-openwrt-linux-uclibcgnueabihf/nvrgui_lvgl/lvgl/src/misc/lv_timer.c:63 #16 0x00015758 in main () at /home/xiejikai/24q3/torchlight/build_dir/target-arm-openwrt-linux-uclibcgnueabihf/nvrgui_lvgl/main.c:75 (gdb) p *(tp_lv_time_picker_t *)0x4dfd4c $10 = {obj = {class_p = 0x27be24 <work_mem_int>, parent = 0x27be24 <work_mem_int>, spec_attr = 0x0, styles = 0x0, style_main_prop_is_set = 2611476, style_other_prop_is_set = 56, user_data = 0x0, id = 0x0, coords = {x1 = 391857407, y1 = 0, x2 = 16777215, y2 = 0}, flags = -16777216, state = 64836, layout_inv = 1, readjust_scroll_after_layout = 0, scr_layout_inv = 1, skip_trans = 1, style_cnt = 4, h_layout = 0, w_layout = 0, is_deleting = 0}, ta = 0x57, popup = 0x3d72d0 <work_mem_int+1422508>, header = 0x1, year_label = 0x717, month_label = 0x3de, calendar = 0x739, time_cont = 0x3e8, hms_selector = 0x717, footer = 0x3de, year_picker = 0x739, month_picker = 0x3e8, hms_picker = 0x0, show_label = 0x0, icon = 0x0, showed_date = {year = 0, month = 0 '\000', day = 0 '\000'}, selected_date = {year = 812, month = 0 '\000', day = 0 '\000'}, origin_date = {year = 0, month = 0 '\000', day = 0 '\000'}, clicked_date = {year = 0, month = 0 '\000', day = 0 '\000'}, date_format = 1079, hour_format = (TP_HOUR_FORMAT_12 | unknown: 2), hour = 224 '\340', minute = 253 '\375', second = 77 'M', origin_hour = 224 '\340', origin_minute = 253 '\375', origin_second = 77 'M', am_pm = 77 'M', content_cont = 0x3b, year_grid_btn = {0x430384 <work_mem_int+1787232>, 0x27be24 <work_mem_int>, 0x0, 0x0, 0x27d914 <work_mem_int+6896>, 0x38, 0x0, 0x0, 0x175b44ff, 0x0, 0xffffff <work_mem_int+14172635>, 0x0}, month_grid_btn = {0xff000000, 0x4dfd44 <work_mem_int+2506528>, 0x57, 0x3c3ce0 <work_mem_int+1343164>, 0x1, 0x48f, 0x3de, 0x48f, 0x3e8, 0x48f, 0x3de, 0x48f}, is_calendar = 232} (gdb) p tp_timebar $11 = (tp_lv_timebar_t *) 0x460324 <work_mem_int+1983744> (gdb) p g_playback_timebar_obj $12 = (lv_obj_t *) 0x460324 <work_mem_int+1983744> (gdb) p (tp_lv_timebar_t *) 0x460324 $13 = (tp_lv_timebar_t *) 0x460324 <work_mem_int+1983744> (gdb) p *(tp_lv_timebar_t *) 0x460324 $14 = {obj = {class_p = 0x23fd60 <tp_lv_timebar_class>, parent = 0x420dd8 <work_mem_int+1724340>, spec_attr = 0x3daba8 <work_mem_int+1437060>, styles = 0x3c6ff4 <work_mem_int+1356240>, style_main_prop_is_set = 65551, style_other_prop_is_set = 0, user_data = 0x606f50 <work_mem_int+3715372>, id = 0x971, coords = {x1 = 280, y1 = 864, x2 = 1919, y2 = 1079}, flags = 64358, state = 0, layout_inv = 0, readjust_scroll_after_layout = 0, scr_layout_inv = 0, skip_trans = 0, style_cnt = 1, h_layout = 0, w_layout = 0, is_deleting = 0}, ctrl_obj = 0x3dab6c <work_mem_int+1437000>, chn_name_obj = 0x3cc31c <work_mem_int+1377528>, video_info_obj = 0x3cc224 <work_mem_int+1377280>, bottom_ctrl_obj = 0x3e2ee8 <work_mem_int+1470660>, play_obj = 0x3d56a8 <work_mem_int+1415300>, single_frame_obj = 0x3d57e0 <work_mem_int+1415612>, speed_obj = 0x4449bc <work_mem_int+1870744>, smartspeed_obj = 0x4b7560 <work_mem_int+2340668>, cut_obj = 0x4810d4 <work_mem_int+2118320>, export_obj = 0x4f30d4 <work_mem_int+2585264>, export_label_obj = 0x52bcf8 <work_mem_int+2817748>, scale_obj = 0x42b620 <work_mem_int+1767420>, people_obj = 0x46771c <work_mem_int+2013432>, vehicle_obj = 0x46788c <work_mem_int+2013800>, pet_obj = 0x4679bc <work_mem_int+2014104>, cut_begin_obj = 0x0, cut_end_obj = 0x0, b30_obj = 0x42a540 <work_mem_int+1763100>, calendar_obj = 0x4dfd4c <work_mem_int+2506536>, f30_obj = 0x3d4f8c <work_mem_int+1413480>, hq_obj = 0x467acc <work_mem_int+2014376>, audio_obj = 0x42a260 <work_mem_int+1762364>, zoom_obj = 0x425244 <work_mem_int+1741856>, screennum_obj = 0x0, fullscreen_obj = 0x3cc104 <work_mem_int+1376992>, save_clip_btn_obj = 0x0, continuous_rec_obj = 0x3e2f7c <work_mem_int+1470808>, event_rec_obj = 0x463448 <work_mem_int+1996324>, expend_obj = 0x4dec60 <work_mem_int+2502204>, clear_obj = 0x3e3378 <work_mem_int+1471828>, tip_label = 0x0, play_state = 0, scale_select_idx = 0, scale_idx = 28, scale = 1440, start_time = 1762833600, cur_time = 1762876800, disp_time_gap = 120, time_clip = 12, pressing = 0, volume_val = 0, speed_index = 4, scrollbar_pos = 0, hq_index = 0, pressed_point = {x = 0, y = 0}, last_point = {x = 0, y = 0}, disp_time_label = {0x429158 <work_mem_int+1758004>, 0x429250 <work_mem_int+1758252>, 0x429348 <work_mem_int+1758500>, 0x429444 <work_mem_int+1758752>, 0x466338 <work_mem_int+2008340>, 0x46640c <work_mem_int+2008552>, 0x466514 <work_mem_int+2008816>, 0x466610 <work_mem_int+2009068>, 0x46670c <work_mem_int+2009320>, 0x46680c <work_mem_int+2009576>, 0x478364 <work_mem_int+2082112>, 0x47843c <work_mem_int+2082328>, 0x478538 <work_mem_int+2082580>, 0x478638 <work_mem_int+2082836>, 0x47873c <work_mem_int+2083096>, 0x478838 <work_mem_int+2083348>}, hover_time_obj = 0x462d38 <work_mem_int+1994516>, chn_label = {0x3cc3c8 <work_mem_int+1377700>, 0x3cc500 <work_mem_int+1378012>, 0x3cc5f8 <work_mem_int+1378260>, 0x42905c <work_mem_int+1757752>}, scrollbar_obj = 0x4def7c <work_mem_int+2503000>, show_scrollbar = 1, chn_num = 8, show_chn_idx = 0, expend = 1, mode = 0, stop_update_time = 0, cur_chn = 0, full_show = 0, export_slice_num = 0, cut_setting_time = 0, left_cut_bar_hoverd = false, right_cut_bar_hoverd = false, left_cut_bar_area = {x1 = 0, y1 = 0, x2 = 0, y2 = 0}, right_cut_bar_area = {x1 = 0, y1 = 0, x2 = 0, y2 = 0}} (gdb) p tp_timebar $15 = (tp_lv_timebar_t *) 0x460324 <work_mem_int+1983744> (gdb) p tp_timebar->ctrl_obj $16 = (lv_obj_t *) 0x3dab6c <work_mem_int+1437000> (gdb) p *(lv_obj_t *) A syntax error in expression, near `'. (gdb) p *(lv_obj_t *) A syntax error in expression, near `'. (gdb) p *(lv_obj_t *)0x460324 $17 = {class_p = 0x23fd60 <tp_lv_timebar_class>, parent = 0x420dd8 <work_mem_int+1724340>, spec_attr = 0x3daba8 <work_mem_int+1437060>, styles = 0x3c6ff4 <work_mem_int+1356240>, style_main_prop_is_set = 65551, style_other_prop_is_set = 0, user_data = 0x606f50 <work_mem_int+3715372>, id = 0x971, coords = {x1 = 280, y1 = 864, x2 = 1919, y2 = 1079}, flags = 64358, state = 0, layout_inv = 0, readjust_scroll_after_layout = 0, scr_layout_inv = 0, skip_trans = 0, style_cnt = 1, h_layout = 0, w_layout = 0, is_deleting = 0} (gdb) p *(lv_obj_t *) 0x3dab6c $18 = {class_p = 0x21e488 <lv_obj_class>, parent = 0x460324 <work_mem_int+1983744>, spec_attr = 0x3dac98 <work_mem_int+1437300>, styles = 0x3dabe8 <work_mem_int+1437124>, style_main_prop_is_set = 232015, style_other_prop_is_set = 4111, user_data = 0x0, id = 0x1c42aa <tp_lv_muti_dropdown_set_select+18>, coords = {x1 = 280, y1 = 864, x2 = 1903, y2 = 918}, flags = 64358, state = 0, layout_inv = 0, readjust_scroll_after_layout = 0, scr_layout_inv = 0, skip_trans = 0, style_cnt = 4, h_layout = 1, w_layout = 1, is_deleting = 0} (gdb) f 5 #5 0x001514b4 in tp_lv_timebar_event_cb (class_p=<optimized out>, e=<optimized out>) at PlaybackBar.c:2268 2268 update_time_str_label(obj); (gdb) tp_timebar->chn_num Undefined command: "tp_timebar->chn_num". Try "help". (gdb) p tp_timebar->chn_num $19 = 8 (gdb) p tp_timebar->calendar_obj $20 = (lv_obj_t *) 0x4dfd4c <work_mem_int+2506536> (gdb) p *(lv_obj_t *) 0x4dfd4c $21 = {class_p = 0x27be24 <work_mem_int>, parent = 0x27be24 <work_mem_int>, spec_attr = 0x0, styles = 0x0, style_main_prop_is_set = 2611476, style_other_prop_is_set = 56, user_data = 0x0, id = 0x0, coords = {x1 = 391857407, y1 = 0, x2 = 16777215, y2 = 0}, flags = -16777216, state = 64836, layout_inv = 1, readjust_scroll_after_layout = 0, scr_layout_inv = 1, skip_trans = 1, style_cnt = 4, h_layout = 0, w_layout = 0, is_deleting = 0} (gdb) p *(lv_obj_t *)0x27be24 $22 = {class_p = 0x0, parent = 0x0, spec_attr = 0x4deff8 <work_mem_int+2503124>, styles = 0x3cc4d8 <work_mem_int+1377972>, style_main_prop_is_set = 1050623, style_other_prop_is_set = 3271562920, user_data = 0xf399dbff, id = 0x35c7bdff, coords = {x1 = -1589395569, y1 = 1596, x2 = 385884183, y2 = 604013289}, flags = 8200, state = 129, layout_inv = 1, readjust_scroll_after_layout = 0, scr_layout_inv = 0, skip_trans = 0, style_cnt = 0, h_layout = 0, w_layout = 0, is_deleting = 0} (gdb) x/16xw 0x4dfd4c 0x4dfd4c <work_mem_int.12761+2506536>: 0x0027be24 0x0027be24 0x00000000 0x00000000 0x4dfd5c <work_mem_int.12761+2506552>: 0x0027d914 0x00000038 0x00000000 0x00000000 0x4dfd6c <work_mem_int.12761+2506568>: 0x175b44ff 0x00000000 0x00ffffff 0x00000000 0x4dfd7c <work_mem_int.12761+2506584>: 0xff000000 0x004dfd44 0x00000057 0x003d72d0 帮我分析上述调用栈
11-18
#include "nvs_flash.h" #include "esp_bt.h" #include "esp_bt_main.h" #include "esp_gap_ble_api.h" #include "esp_gatts_api.h" #include "esp_netif.h" #include "esp_eth.h" #include "esp_event.h" #include "esp_log.h" #define TAG "ETHERNET" #define GATTS_SERVICE_UUID_TEST_A 0x00FF #define GATTS_CHAR_UUID_TEST_A 0xFF01 #define GATTS_NUM_HANDLE_TEST_A 4 // 全局错误标志 static bool global_error_flag = false; // 错误处理函数 void handle_error(const char *error_msg, esp_err_t err) { ESP_LOGE(TAG, "%s, error code = %x", error_msg, err); global_error_flag = true; } // 蓝牙天线与主控芯片的封装 static uint16_t service_handle, char_handle; static esp_gatts_attr_db_t test_gatt_db[GATTS_NUM_HANDLE_TEST_A] = { // 服务声明 [0] = { .attr_control = {.auto_rsp = ESP_GATT_AUTO_RSP}, .attr_uuid = {.len = ESP_UUID_LEN_16, .uuid = {.uuid16 = ESP_GATT_UUID_PRI_SERVICE}}, .perm = ESP_GATT_PERM_READ, .property = 0, .p_value = (uint8_t *)&GATTS_SERVICE_UUID_TEST_A, .value_len = 2, }, // 特征声明 [1] = { .attr_control = {.auto_rsp = ESP_GATT_AUTO_RSP}, .attr_uuid = {.len = ESP_UUID_LEN_16, .uuid = {.uuid16 = ESP_GATT_UUID_CHAR_DECLARE}}, .perm = ESP_GATT_PERM_READ, .property = ESP_GATT_CHAR_PROP_BIT_READ | ESP_GATT_CHAR_PROP_BIT_WRITE, .p_value = (uint8_t *)&ESP_GATT_CHAR_PROP_BIT_READ | ESP_GATT_CHAR_PROP_BIT_WRITE, .value_len = 1, }, // 特征值 [2] = { .attr_control = {.auto_rsp = ESP_GATT_AUTO_RSP}, .attr_uuid = {.len = ESP_UUID_LEN_16, .uuid = {.uuid16 = GATTS_CHAR_UUID_TEST_A}}, .perm = ESP_GATT_PERM_READ | ESP_GATT_PERM_WRITE, .property = ESP_GATT_CHAR_PROP_BIT_READ | ESP_GATT_CHAR_PROP_BIT_WRITE, .p_value = NULL, .value_len = 0, }, // 客户端特征配置描述符 [3] = { .attr_control = {.auto_rsp = ESP_GATT_AUTO_RSP}, .attr_uuid = {.len = ESP_UUID_LEN_16, .uuid = {.uuid16 = ESP_GATT_UUID_CHAR_CLIENT_CONFIG}}, .perm = ESP_GATT_PERM_READ | ESP_GATT_PERM_WRITE, .property = 0, .p_value = NULL, .value_len = 2, }, }; static void gatts_event_handler(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param) { switch (event) { case ESP_GATTS_REG_EVT: { esp_err_t set_dev_name_ret = esp_ble_gap_set_device_name("ESP32_BLE_Device"); if (set_dev_name_ret) { handle_error("set device name failed", set_dev_name_ret); } esp_ble_adv_params_t adv_params = { .adv_int_min = 0x20, .adv_int_max = 0x40, .adv_type = ADV_TYPE_IND, .own_addr_type = BLE_ADDR_TYPE_PUBLIC, .channel_map = ADV_CHNL_ALL, .adv_filter_policy = ADV_FILTER_ALLOW_SCAN_ANY_CON_ANY, }; // 优化蓝牙广播数据,添加更多有用信息 esp_ble_adv_data_t adv_data = { .set_scan_rsp = false, .include_name = true, .include_txpower = true, .min_interval = 0x0006, .max_interval = 0x0010, .appearance = 0x00, .manufacturer_len = 0, .p_manufacturer_data = NULL, .service_data_len = 0, .p_service_data = NULL, .service_uuid_len = sizeof(GATTS_SERVICE_UUID_TEST_A), .p_service_uuid = (uint8_t *)&GATTS_SERVICE_UUID_TEST_A, .flag = (ESP_BLE_ADV_FLAG_GEN_DISC | ESP_BLE_ADV_FLAG_BREDR_NOT_SPT), }; esp_err_t ret = esp_ble_gap_config_adv_data(&adv_data); if (ret) { handle_error("config adv data failed", ret); } ret = esp_ble_gap_set_adv_params(&adv_params); if (ret) { handle_error("set adv params failed", ret); } esp_err_t create_attr_ret = esp_ble_gatts_create_attr_tab(test_gatt_db, gatts_if, GATTS_NUM_HANDLE_TEST_A, 0); if (create_attr_ret) { handle_error("create attr table failed", create_attr_ret); esp_ble_gap_stop_adv(); return; } break; } case ESP_GATTS_CREATE_EVT: { service_handle = param->create.service_handle; break; } case ESP_GATTS_ADD_CHAR_EVT: { char_handle = param->add_char.attr_handle; break; } default: break; } } // 主控芯片与网口的通信 class EthernetManager { public: EthernetManager() { const int max_retries = 3; int retry_count = 0; esp_err_t err; do { err = esp_netif_init(); if (err) { handle_error("esp_netif_init failed", err); retry_count++; vTaskDelay(pdMS_TO_TICKS(1000)); continue; } err = esp_event_loop_create_default(); if (err) { handle_error("esp_event_loop_create_default failed", err); retry_count++; vTaskDelay(pdMS_TO_TICKS(1000)); continue; } esp_netif_config_t cfg = ESP_NETIF_DEFAULT_ETH(); esp_netif_create_default_eth(&cfg); eth_mac_config_t mac_config = ETH_MAC_DEFAULT_CONFIG(); eth_phy_config_t phy_config = ETH_PHY_DEFAULT_CONFIG(); phy_config.phy_addr = 0; phy_config.reset_gpio_num = -1; mac = esp_eth_mac_new_esp32(&mac_config); phy = esp_eth_phy_new_lan8720(&phy_config); esp_eth_config_t eth_config = ETH_DEFAULT_CONFIG(mac, phy); err = esp_eth_driver_install(&eth_config, &eth_handle); if (err) { handle_error("Failed to install Ethernet driver", err); retry_count++; vTaskDelay(pdMS_TO_TICKS(1000)); continue; } err = esp_event_handler_register(ETH_EVENT, ESP_EVENT_ANY_ID, &eth_event_handler, this); if (err) { handle_error("esp_event_handler_register for ETH_EVENT failed", err); } err = esp_event_handler_register(IP_EVENT, IP_EVENT_ETH_GOT_IP, &ip_event_handler, this); if (err) { handle_error("esp_event_handler_register for IP_EVENT failed", err); } break; } while (retry_count < max_retries); if (retry_count >= max_retries) { handle_error("Ethernet initialization failed after multiple retries", ESP_FAIL); } } ~EthernetManager() { esp_eth_stop(eth_handle); esp_eth_driver_uninstall(eth_handle); esp_eth_phy_del(phy); esp_eth_mac_del(mac); } void start() { esp_err_t err = esp_eth_start(eth_handle); if (err) { handle_error("Failed to start Ethernet", err); } } private: static void eth_event_handler(void *arg, esp_event_base_t event_base, int32_t event_id, void *event_data) { EthernetManager *manager = static_cast<EthernetManager*>(arg); switch (event_id) { case ETHERNET_EVENT_CONNECTED: ESP_LOGI(TAG, "Ethernet Link Up"); break; case ETHERNET_EVENT_DISCONNECTED: ESP_LOGI(TAG, "Ethernet Link Down"); break; default: break; } } static void ip_event_handler(void *arg, esp_event_base_t event_base, int32_t event_id, void *event_data) { ip_event_got_ip_t *event = (ip_event_got_ip_t *) event_data; const esp_netif_ip_info_t *ip_info = &event->ip_info; ESP_LOGI(TAG, "Ethernet Got IP Address"); ESP_LOGI(TAG, "~~~~~~~~~~~"); ESP_LOGI(TAG, "ETHIP:" IPSTR, IP2STR(&ip_info->ip)); ESP_LOGI(TAG, "ETHMASK:" IPSTR, IP2STR(&ip_info->netmask)); ESP_LOGI(TAG, "ETHGW:" IPSTR, IP2STR(&ip_info->gw)); ESP_LOGI(TAG, "~~~~~~~~~~~"); } esp_eth_mac_t *mac; esp_eth_phy_t *phy; esp_eth_handle_t eth_handle; }; // 主程序运行 void app_main() { esp_err_t ret; // 初始化 NVS ret = nvs_flash_init(); if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) { esp_err_t erase_ret = nvs_flash_erase(); if (erase_ret) { handle_error("nvs flash erase failed", erase_ret); } ret = nvs_flash_init(); } if (ret) { handle_error("nvs flash init failed", ret); return; } // 初始化蓝牙控制器 esp_bt_controller_mem_release(ESP_BT_MODE_CLASSIC_BT); esp_bt_controller_config_t bt_cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT(); ret = esp_bt_controller_init(&bt_cfg); if (ret) { handle_error("initialize controller failed", ret); return; } // 启用蓝牙控制器 ret = esp_bt_controller_enable(ESP_BT_MODE_BLE); if (ret) { handle_error("enable controller failed", ret); return; } // 初始化蓝牙协议栈 ret = esp_bluedroid_init(); if (ret) { handle_error("init bluetooth failed", ret); return; } ret = esp_bluedroid_enable(); if (ret) { handle_error("enable bluetooth failed", ret); return; } esp_ble_gatts_register_callback(gatts_event_handler); esp_ble_gatts_app_register(0); EthernetManager ethManager; ethManager.start(); while (1) { // 主循环可以添加其他任务 if (global_error_flag) { // 可以在这里添加错误处理逻辑,如重启等 } vTaskDelay(pdMS_TO_TICKS(1000)); } } 不涉及wifi只涉及蓝牙连接
09-26
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值