• 易迪拓培训,专注于微波、射频、天线设计工程师的培养
首页 > 无线通信 > 技术讨论 > 熟悉固件源码

熟悉固件源码

录入:edatop.com     点击:
源码文件还是很多的,先从主函数开始一层层梳理

  1. void  et_user_main(void *pvParameters)
  2. {
  3.         et_int32 rc = -1;
  4.         et_int32 num = 0;
  5.         id_info_t *id;
  6. /*        g_cloud_con_para.auto_relogin = TRUE;
  7.         g_cloud_con_para.clr_offline_mes = TRUE;
  8.         g_cloud_con_para.server_addr = ADDRESS;
  9.         g_cloud_con_para.server_port = PORT;*/
  10.         os_printf("ET U-SDK var%s\n",et_sdk_var());
  11.        
  12.         to_stop_app = 0;

  13.         id = (id_info_t *)malloc(sizeof(id_info_t));
  14.         if(id == NULL)
  15.         {
  16.                 os_printf("et_user_main, malloc id failed\n");
  17.                 return ;
  18.         }
  19.        
  20.         memset(id, 0, sizeof(id_info_t));
  21.         if(get_uid(id) != SPI_FLASH_RESULT_OK)
  22.         {
  23.                 os_printf("et_user_main, get_uid error\n");
  24.                 free(id);
  25.                 return ;
  26.         }
  27.        
  28.         g_cloud_handle = et_create_context(id->uid, id->appkey, SECRETKEY);
  29.         if(NULL == g_cloud_handle)
  30.                 os_printf("Init et account failed\n");
  31.         et_set_callback(g_cloud_handle,et_message_process, et_event_process);
  32.        
  33.         rc = et_start_svr(g_cloud_handle);

  34.         if(rc != 0)
  35.         {
  36.                 os_printf("et_start_svr fail\n");
  37.         }
  38.        
  39.         do
  40.         {
  41.                 rc = et_login_cloud(g_cloud_handle, g_cloud_con_para);

  42.                 if(rc != 0)
  43.                 {
  44.                         os_printf("login_cloud fail\n");
  45.                 }
  46.                 num++;
  47.                 vTaskDelay(num*100*portTICK_RATE_MS);
  48.         }while(rc != 0 && num < 3 && to_stop_app == 0);

  49.         if(rc == 0)
  50.         {
  51.                 os_printf("now start init friend\n");       
  52.                 init_clients();
  53. //                rc = et_get_buddies_online(g_cloud_handle);
  54.                 rc = et_req_buddies_list(g_cloud_handle, LIST_ONLINE);
  55.                 if(rc < 0)
  56.                         os_printf("Get online buddies failed\n");
  57.                 else
  58.                         os_printf("Get online buddies sucess\n");
  59.                 rc = et_sub_allbuddies_state(g_cloud_handle);
  60.                 if(rc < 0)
  61.                         os_printf("Sub all buddies state failed\n");
  62.                 else
  63.                         os_printf("Sub all buddies state sucess\n");
  64.         }
  65.         free(id);
  66.         vTaskDelete(NULL);
  67.         return ;
  68. }

复制代码

以上是主函数部分,
通篇的os_printf,还有最后的vTaskDelete无不表明了,这涉及到操作系统了
g_cloud_con_para的相关配置,虽然注销掉了,但这可能就是涉及云端的处理部分了
但这不是主函数的开始


由给出的参考流程可知,在往上还有些初始化才对
查找函数调用,确实

  1. /******************************************************************************
  2. * FunctionName : user_esp_platform_check_ip
  3. * Description  : check whether get ip addr or not
  4. * Parameters   : none
  5. * Returns      : none
  6. *******************************************************************************/
  7. void ICACHE_FLASH_ATTR
  8. user_esp_platform_check_ip(void)
  9. {       
  10.         static et_uint32 time = 0;
  11.         struct ip_info ipconfig;

  12.         os_timer_disarm(&test_timer);       
  13.         //get ip info of ESP8266 station
  14.         wifi_get_ip_info(STATION_IF, &ipconfig);
  15.         if (wifi_station_get_connect_status() == STATION_GOT_IP && ipconfig.ip.addr != 0)
  16.         {
  17.                 os_printf("got ip ! \r\n");
  18.                 user_set_wifi_led_on();
  19.                 if (user_main_start_flag == 0)
  20.                 {
  21.                         user_main_start_flag = 1;
  22.                         xTaskCreate(et_user_main, "et_user_main", 512, NULL, 5, NULL);
  23.                 }
  24.                 wifi_reconnect_start_flag = 1;
  25.         }
  26.         else
  27.         {
  28.                 if (wifi_station_get_connect_status() == STATION_WRONG_PASSWORD
  29.                         || wifi_station_get_connect_status() == STATION_NO_AP_FOUND
  30.                         || wifi_station_get_connect_status() == STATION_CONNECT_FAIL)
  31.                 {
  32.                         if ((system_get_time() - time) >= 5000000)
  33.                         {                               
  34.                                 os_printf("connect fail wrong password or ssid wrong! \r\n");
  35.                                 time = system_get_time();
  36.                         }
  37.                        
  38.                         if (air_kiss_start_flag == 1)
  39.                         {
  40.                                 wifi_station_set_reconnect_policy(false);
  41.                                 smartconfig_stop();
  42.                                 air_kiss_start_flag = 0;
  43.                         }
  44.             }
  45.                
  46.                 //re-arm timer to check ip
  47.                 os_timer_setfn(&test_timer, (os_timer_func_t *)user_esp_platform_check_ip, NULL);
  48.                 os_timer_arm(&test_timer, 1000, 0);
  49.         }
  50. }

复制代码

果然是更深一层的操作系统部分,定时器设定、wifi状态设定、是否建立应用层主函数
xTaskCreate(et_user_main, "et_user_main", 512, NULL, 5, NULL);调用了之前的那个函数
而user_esp_platform_check_ip这个函数也在更上一层的user_init中被调用

  1. /******************************************************************************
  2. * FunctionName : user_init
  3. * Description  : entry of user application, init user function here
  4. * Parameters   : none
  5. * Returns      : none
  6. *******************************************************************************/
  7. void user_init(void)
  8. {       
  9.         key_gpio_t key;
  10.         struct station_config config;
  11.         struct ip_info info;
  12.         et_uchar result=0;
  13.        
  14.     os_printf("now SDK version:%s\n", system_get_sdk_version());

  15.         if(get_fac_norm_mode(&result) != SPI_FLASH_RESULT_OK)
  16.         {
  17.                 os_printf("get_fac_norm_mode error, NORMAL mode\n");
  18.         }
  19.        
  20.         if(result == FAC_MODE)
  21.         {
  22.                 os_printf("run in factory mode\n");
  23.                 uart_init_new_uart1(BIT_RATE_115200);
  24.                 UART_SetPrintPort(UART1);
  25.                 uart_init_new(BIT_RATE_9600, result);
  26.                 return;
  27.         }

  28.         os_printf("run in normal mode\n");
  29.         // show logo
  30.         user_show_logo();

  31.         if (RETURN_OK != user_get_work_mode(&work_mode))
  32.         {
  33.                 os_printf("get work mode fail !\n");
  34.                 return;
  35.         }

  36.         if (RETURN_OK != user_init_work_mode(work_mode, result))
  37.         {
  38.                 os_printf("init work mode fail !\n");
  39.                 return;
  40.         }
  41.         // wifi led control
  42.         xTaskCreate(user_wifi_led_control, "wifi_led_control", 256, NULL, 2, NULL);
  43.         //wifi event handle
  44.         wifi_set_event_handler_cb(et_wifi_event_cb);
  45.        
  46.         memset(&key, 0, sizeof(key_gpio_t));
  47.         key.key_gpio_pin = AIRKISS_KEY_IO_PIN;
  48.         key.key_num = AIRKISS_KEY_IO_NUM;

  49.         airkiss_key_init(&key);
  50.         wifi_set_opmode(STATION_MODE);

  51.         wifi_reconnect_start_flag = 0;

  52.         xTaskCreate(airkiss_key_poll_task, "smartconfig_task", 256, NULL, 2, NULL);

  53.         memset(&config, 0, sizeof(struct station_config));
  54.         if(wifi_station_get_config_default(&config) == true)
  55.         {
  56.                 os_printf("ssid=%s\n", config.ssid);
  57.                 wifi_station_set_config_current(&config);
  58.                 //for static ip set
  59.                 /*wifi_station_dhcpc_stop();
  60.                 IP4_ADDR(&info.ip, 192, 168, 1, 43);
  61.                 IP4_ADDR(&info.gw, 192, 168, 1, 1);
  62.                 IP4_ADDR(&info.netmask, 255, 255, 255, 0);
  63.                 wifi_set_ip_info(STATION_IF, &info);*/
  64.         }
  65.        
  66.         os_timer_disarm(&test_timer);
  67.            os_timer_setfn(&test_timer, (os_timer_func_t *)user_esp_platform_check_ip, NULL);
  68.            os_timer_arm(&test_timer, 1000, 0);

  69. }

复制代码

在这一层对当前进度信息包括SDK的版本等不断输出,分别创建任务处理wifi控制led的和按键配置,并且具体的像GPIO的配制、wifi参数的配制、操作系统定时器的设置等底层基础 的进行了设置
xTaskCreate(user_wifi_led_control, "wifi_led_control", 256, NULL, 2, NULL);
xTaskCreate(airkiss_key_poll_task, "smartconfig_task", 256, NULL, 2, NULL);
而user_init这个函数才是整个用户应用程序的开始,
不过再往前的系统初始化部分没找到
从user_init这个函数开始,一层层的,按照参考流程把主体函数给拎出来,从而对整体的源码就有了个初步了解



很好,如果可以把下一篇,上一篇留在片尾的话,可以更方便观看者。

不错        加油

上一篇:一号互联e信WiFi+无线会议案例
下一篇:求大神指点迷津

手机天线设计培训教程详情>>

手机天线设计培训教程 国内最全面、系统、专业的手机天线设计培训课程,没有之一;是您学习手机天线设计的最佳选择...【More..

射频和天线工程师培训课程详情>>

  网站地图