pvvx
Активный участник сообщества
О медлительности старта в SDK3.5 уже описывал: Скорость подключения модуля к внешней AP
Тут будем пробовать 'модифицировать' SDK3.5 для ускорения старта и потребления для автономных устройств. Но это позже. Сейчас рассмотрим то, что позволяет последний на сегодня SDK 3.5.
Для примера RTL00 из режима deep_sleep по изменению уровня на PA_5 будет соединяться с AP на ESP8266, а ESP8266 в это время анализирует питание RTL00. Сразу после соединения и получения IP модуль RTL00 производит тестовый запрос и чтение основной страницы HTTP-Web-сервера на ESP8266 и далее отключается - переходит в режим deep_sleep.
Часть кода, для информации что примерно будем исследовать:
Main() запускает соединение WiFi по записанным ранее в Flash установкам.
Дополнительно в код включена поддержка нескольких отладочных AT команд.
В итоге, в резерве, в RTL00 остается около 200 килобайт неиспользованной RAM (пик во время открытого socked).
По питанию это выглядит так:
(1 клетка = 1 секунда, 0.58 mA - аппаратная ошибка модуля)
Тут будем пробовать 'модифицировать' SDK3.5 для ускорения старта и потребления для автономных устройств. Но это позже. Сейчас рассмотрим то, что позволяет последний на сегодня SDK 3.5.
Для примера RTL00 из режима deep_sleep по изменению уровня на PA_5 будет соединяться с AP на ESP8266, а ESP8266 в это время анализирует питание RTL00. Сразу после соединения и получения IP модуль RTL00 производит тестовый запрос и чтение основной страницы HTTP-Web-сервера на ESP8266 и далее отключается - переходит в режим deep_sleep.
Часть кода, для информации что примерно будем исследовать:
Код:
#define SOCKET_STACK_SIZE 250
#define SOCKET_PRIORITY tskIDLE_PRIORITY + 7 + PRIORITIE_OFFSET
extern struct netif xnetif[NET_IF_NUM];
#define rmt_port 80
#define rmt_ip (xnetif[0].gw.addr) // 0x0104A8C0 = 192.168.4.1
char fbuf[512];
int fbuf_cnt;
gpio_t gpio_obj;
// чтение и пропуск HTTP заголовка
int http_head_read(unsigned char *buf, int len, int ff) {
int flg_head = 0;
int n, ret = 0;
fbuf_cnt = 0;
if ((n = read(ff, buf, len)) <= 0) return 0;
if(n > 11 && *((u32 *)buf) == 0x50545448) { // "HTTP" // HTTP/1.0 200 OK
int x;
for(x = 3; x < n && buf[x] != ' '; x++);
while(x < n && buf[x] == ' ') x++;
if(x < n) ret = atoi(&buf[x]);
int cnt = 0;
x = 0;
while(ret) {
int z = 0;
while (x < n) {
if (cnt++ > 16384) return 600; // Header Too Large
if (buf[x++] == ((flg_head & 1) ? 0x0a : 0x0d)) {
if ((flg_head & 3) == 1) {
#if DEBUG_MAIN_LEVEL > 0
buf[x-1] = 0;
DBG_8195A("%s\n", &buf[z]);
#endif
z = x;
}
if (flg_head >= 3) {
if (n - x > 0) {
fbuf_cnt = n - x;
rtl_memcpy(&fbuf, &buf[x], fbuf_cnt);
}
#if DEBUG_MAIN_LEVEL > 1
DBG_8195A("TST: Skip HTTP head in %d bytes\n\n", cnt);
#endif
return ret;
}
flg_head++;
}
else flg_head = 0;
}
x = 0;
while(z < n) buf[x++] = buf[z++];
if ((n = read(ff, &buf[x], len - x)) <= 0) return 601; // content ??
n += x;
};
}
fbuf_cnt = n;
return ret;
}
// Тестовый socked
void test_socked(void)
{
struct sockaddr_in remote_ip;
int sock = socket(PF_INET, SOCK_STREAM, 0);
if (sock == -1) {
#if DEBUG_MAIN_LEVEL > 0
DBG_8195A("TST: Not open socket!\n");
#endif
vTaskDelete(NULL);
return;
}
rtl_memset(&remote_ip, 0, sizeof(remote_ip));
remote_ip.sin_family = AF_INET;
remote_ip.sin_addr.s_addr = rmt_ip;
remote_ip.sin_port = htons(rmt_port);
DiagPrintf("\nSocked connect at start %d ms.\n", xTaskGetTickCount());
if (connect(sock, (struct sockaddr * )(&remote_ip), sizeof(struct sockaddr)) != 00) {
close(sock);
#if DEBUG_MAIN_LEVEL > 0
DBG_8195A("TST: Connect error!\n");
#endif
vTaskDelete(NULL);
return;
}
sprintf(&fbuf,"GET / HTTP/1.0/\r\nTime at start %d ms.\r\n\r\n", xTaskGetTickCount());
int x = strlen(&fbuf);
write(sock, &fbuf, x);
if ((x = http_head_read(fbuf, sizeof(fbuf), sock)) != 200) {
#if DEBUG_MAIN_LEVEL > 0
DBG_8195A("TST: HTTP error %d\n", x);
#endif
}
close(sock);
DiagPrintf("\nSocked close at start %d ms.\n", xTaskGetTickCount());
wifi_off();
DiagPrintf("\nDeep-sleep at start %d ms.\n", xTaskGetTickCount());
sys_log_uart_off(); // turn off log uart
HalPinCtrlRtl8195A(JTAG, 0, 0); // turn off JTAG
// Enter deep_sleep, wakeap: PA_5
gpio_init(&gpio_obj, PA_5);
gpio_dir(&gpio_obj, PIN_INPUT);
gpio_mode(&gpio_obj, PullUp);
standby_wakeup_event_add(STANDBY_WAKEUP_BY_PA5, 0, gpio_read(&gpio_obj)? 0 : 1); deepstandby_ex();
vTaskDelete(NULL);
}
// Connect_start() вызывается при подключении WiFi к внешней AP и получении IP (встроил в свой SDK).
void connect_start(void)
{
#if DEBUG_MAIN_LEVEL > 0
DiagPrintf("\nConnected at start %d ms.\n", xTaskGetTickCount());
#endif
if (pdTRUE != xTaskCreate( test_socked, (const signed char * const)"socked", SOCKET_STACK_SIZE, NULL, SOCKET_PRIORITY, NULL))
DiagPrintf("Create Log UART Task Err!\n");
}
Дополнительно в код включена поддержка нескольких отладочных AT команд.
В итоге, в резерве, в RTL00 остается около 200 килобайт неиспользованной RAM (пик во время открытого socked).
Код:
#interface 1 is initialized
interface 0 is initialized
Initializing WIFI ...
Start LOG SERVICE MODE
# WiFi Init after 299ms
Joining BSS by SSID ESP8266...
RTL8195A[Driver]: set ssid [ESP8266]
RTL8195A[Driver]: start auth to 1a:fe:34:99:ad:1d
RTL8195A[Driver]: auth success, start assoc
RTL8195A[Driver]: association success(res=2)
WiFi connected at start 1591ms
Connected after 1294ms
Interface 0 IP address : 192.168.4.3
Got IP after 1810ms
Connected at start 2121 ms.
Socked connect at start 2129 ms.
WIFI initialized
HTTP/1.1 200 OK
Server: PVs/0.1
Connection: close
Access-Control-Allow-Origin: *
Content-Type: text/html
Cache-Control: no-store, no-cache, must-revalidate, max-age=0
Socked close at start 2213 ms.
LwIP_DHCP: dhcp stop.
Deinitializing WIFI ...
[rltk_wlan_deinit] Wait for TX/RX Busy (1)WIFI deinitialized
Deep-sleep at start 3351 ms.
По питанию это выглядит так:
(1 клетка = 1 секунда, 0.58 mA - аппаратная ошибка модуля)
Последнее редактирование: