Где определение system_adc_read() в коде esp8266 Arduino?
Где находится определение uint16 system_adc_read(void)
в коде esp8266 Arduino?
Я вижу, что он объявлен в Arduino/tools/sdk/include/user_interface.h
, однако, похоже, для этого нет определения. system_adc_read()
вызывается в analogRead( )
в Arduino/cores/esp8266/core_esp8266_wiring_analog.c
Я подозреваю, что system_adc_read()
вызывает system_adc_read_fast()
для чтения ADC, но не может найти его в коде! Может ли кто-нибудь указать мне на это? Я уже довольно долго мучаюсь.
Цель: манипулировать system_adc_read() в ESP8266 для повышения частоты дискретизации АЦП. Прямо сейчас частота дискретизации АЦП составляет 10 кс/с. Я хочу, чтобы она была больше 30–40 тыс./с.
@Ashish Ranjan, 👍3
Обсуждение1 ответ
Лучший ответ:
"Определение" uint16 system_adc_read(void)
находится внутри скомпилированного архива/объектного файла libmain.a
внутри одного из NONOSDK
папки, расположенные в /tools/sdk/lib/
. Версия выбирается в platform.txt
. Например, в моей платформе.txt:
# default SDK for all boards
# (generic board overrides this variable)
build.sdk=NONOSDK22x_190703
#build.sdk=NONOSDK22x_191024
#build.sdk=NONOSDK22x_191105
Запуская xtensa-lx106-elf-objdump.exe -d
в этом файле, я могу найти этот раздел внутри:
00000258 <system_adc_read>:
258: 020c movi.n a2, 0
25a: f0c112 addi a1, a1, -16
25d: 0109 s32i.n a0, a1, 0
25f: fffc01 l32r a0, 250 <system_pp_recycle_rx_pkt+0x18>
262: 0000c0 callx0 a0
265: fff901 l32r a0, 24c <system_pp_recycle_rx_pkt+0x14>
268: f42020 extui a2, a2, 0, 16
26b: 1b1207 beq a2, a0, 28a <system_adc_read+0x32>
26e: b30c movi.n a3, 11
270: 902220 addx2 a2, a2, a2
273: 1122e0 slli a2, a2, 2
276: fff701 l32r a0, 254 <system_pp_recycle_rx_pkt+0x1c>
279: 0000c0 callx0 a0
27c: f42020 extui a2, a2, 0, 16
27f: 00a402 movi a0, 0x400
282: 013027 bltu a0, a2, 287 <system_adc_read+0x2f>
285: 020d mov.n a0, a2
287: f42000 extui a2, a0, 0, 16
28a: 0108 l32i.n a0, a1, 0
28c: 10c112 addi a1, a1, 16
28f: f00d ret.n
291: 00 .byte 00
292: 00 .byte 00
293: 00 .byte 00
294: ff ff 00 00
...
000002a0 <system_adc_read_fast>:
2a0: e0c112 addi a1, a1, -32
2a3: 11c9 s32i.n a12, a1, 4
2a5: 21d9 s32i.n a13, a1, 8
2a7: 31e9 s32i.n a14, a1, 12
2a9: 5129 s32i.n a2, a1, 20
2ab: 41f9 s32i.n a15, a1, 16
2ad: 0109 s32i.n a0, a1, 0
2af: 03fd mov.n a15, a3
2b1: fff901 l32r a0, 298 <system_adc_read+0x40>
2b4: 0000c0 callx0 a0
2b7: 4fbc beqz.n a15, 2ef <system_adc_read_fast+0x4f>
2b9: fff6e1 l32r a14, 294 <system_adc_read+0x3c>
2bc: 0c0c movi.n a12, 0
2be: 51d8 l32i.n a13, a1, 20
2c0: 90dcd0 addx2 a13, a12, a13
2c3: 001d32 l16ui a3, a13, 0
2c6: 1a13e7 beq a3, a14, 2e4 <system_adc_read_fast+0x44>
2c9: 902330 addx2 a2, a3, a3
2cc: 1122e0 slli a2, a2, 2
2cf: b30c movi.n a3, 11
2d1: fff201 l32r a0, 29c <system_adc_read+0x44>
2d4: 0000c0 callx0 a0
2d7: f44020 extui a4, a2, 0, 16
2da: 00a402 movi a0, 0x400
2dd: 003d mov.n a3, a0
2df: 013047 bltu a0, a4, 2e4 <system_adc_read_fast+0x44>
2e2: 043d mov.n a3, a4
2e4: 005d32 s16i a3, a13, 0
2e7: cc1b addi.n a12, a12, 1
2e9: f4c0c0 extui a12, a12, 0, 16
2ec: ce9fc7 bne a15, a12, 2be <system_adc_read_fast+0x1e>
2ef: 11c8 l32i.n a12, a1, 4
2f1: 21d8 l32i.n a13, a1, 8
2f3: 31e8 l32i.n a14, a1, 12
2f5: 41f8 l32i.n a15, a1, 16
2f7: 0108 l32i.n a0, a1, 0
2f9: 20c112 addi a1, a1, 32
2fc: f00d ret.n
2fe: 00 .byte 00
2ff: 00 .byte 00
300: ff ff 00 00
...
Классная детективная работа. Спасибо! Я смог реализовать свой вариант использования, используя это: https://arduinoprosto.ru/q/52854/25931, @Ashish Ranjan
@loadingnow может ли кто-нибудь уточнить, возвращает ли system_adc_read 0-1023 или 1-1024?, @S. Imp
@ S.Imp Я не уверен, но вам следует задать отдельный вопрос для уточнения. Это было бы намного полезнее для других, у которых есть тот же вопрос., @loadingnow
- ESP8266: system_adc_read_fast() всегда возвращает 1024
- Arduino/ESP8266 нет данных SPI, поступающих от MCP3008
- Любой способ использовать DMA для передачи данных на SD - карту в ESP8266
- ADS1115, ACS712 и ESP8266
- 8266 AnalogRead(A0) всегда 1024
- Измерение уровня заряда батареи с уже используемым АЦП
- Как читать и записывать EEPROM в ESP8266
- Как сделать выводы Tx и Rx на ESP-8266-01 в выводах GPIO?
esp8266 SDK не является открытым исходным кодом, @Juraj
Боже мой! Спасибо, что сказали мне это. Итак, каковы мои альтернативы здесь? Я искал способы улучшить частоту дискретизации, но не смог достичь желаемого уровня (30-40 ksps)., @Ashish Ranjan
попробуйте ESP8266 Non-OS SDK API Reference здесь http://espressif.com/en/support/download/overview?keys=&field_type_tid%5B%5D=14, @Juraj