Помогите с портированием...

Беннебой
Пн 20 февраля 2017 г., 19:39
Я пытаюсь перенести довольно устаревший код Arduino в STM32.

Мне удалось исправить все проблемы с компиляциями, сначала в рамках Arduino/Mega - в основном из -за различий в Progmem (код предварительно 1.5).

К сожалению, код теперь падает, когда я пытаюсь компилировать для Maple Mini.

Есть немного крыс гнездо предупреждений, а затем сбой, который, я думаю, все, вероятно, связаны с PGMSPACE - исходный код довольно агрессивно использует ProGMem, чтобы сохранить все, что работает на меньшем H/W.

Любые идеи?

Прилагается исходный код, включая необходимые библиотеки (кроме SDFAT).
#include #include #include #include #include "SdFat.h" SPIClass _SPI(2); #define ce_nrf PA8 #define csn_nrf PB12 #define irq_nrf PA0 //#define cs_sd PA4 const uint8_t cs_sd = PA4; // chip select for sd #define lmp_hijau PA2 #define lmp_merah PA3 Enrf24 radio(ce_nrf, csn_nrf, irq_nrf); //const uint8_t node[] = { 0xF0F0F0F0E1LL }; const uint64_t node[] = {0xF0F0F0F0E1LL, 0xF0F0F0F0E2LL}; SdFat SD(1); // Edit Use SPI1 File file; void setup() { Serial1.begin(9600); _SPI.begin(); _SPI.setDataMode(SPI_MODE0); _SPI.setBitOrder(MSBFIRST); pinMode(lmp_hijau, OUTPUT); pinMode(lmp_merah, OUTPUT); Serial1.print("Initializing SD card..."); if (!SD.begin(cs_sd)) { Serial1.println("initialization failed!"); return; } Serial1.println("Initializing SD card done."); radio.setSPI(&_SPI); radio.begin(); // Defaults 1Mbps, channel 0, max TX power radio.setRXaddress((void*)node); radio.enableRX(); } void loop() { char uid[] = ""; radio_state(radio.radioState()); while (!radio.available(true)); if (radio.read(uid)) { Serial1.print("Received packet: "); Serial1.println(uid); file = SD.open("18042018.txt", FILE_WRITE); if (file) { file.println(uid); file.close(); Serial1.println("done."); digitalWrite(lmp_hijau, HIGH); delay(200); digitalWrite(lmp_hijau, LOW); } else { Serial1.println("error opening file"); digitalWrite(lmp_merah, HIGH); delay(200); digitalWrite(lmp_merah, LOW); } } } void radio_state(uint8_t status) { Serial1.print("Enrf24 radio transceiver status: "); switch (status) { case ENRF24_STATE_NOTPRESENT: Serial1.println("NO TRANSCEIVER PRESENT"); break; case ENRF24_STATE_DEEPSLEEP: Serial1.println("DEEP SLEEP <1uA power consumption"); break; case ENRF24_STATE_IDLE: Serial1.println("IDLE module powered up w/ oscillators running"); break; case ENRF24_STATE_PTX: Serial1.println("Actively Transmitting"); break; case ENRF24_STATE_PRX: Serial1.println("Receive Mode"); break; default: Serial1.println("UNKNOWN STATUS CODE"); } }

Беннебой
Пн 20 февраля 2017 г., 19:50
Это определение strlcpy_p от arduino avr/pgmspace.час:
#include #include #include #include #include "SdFat.h" SPIClass _SPI(2); #define ce_nrf PA8 #define csn_nrf PB12 #define irq_nrf PA0 #define cs_sd PA4 #define lmp_hijau PA2 #define lmp_merah PA3 Enrf24 radio(ce_nrf, csn_nrf, irq_nrf); const uint8_t node[] = { 0xF0F0F0F0E1LL }; //const uint64_t node[] = {0xF0F0F0F0E1LL, 0xF0F0F0F0E2LL}; SdFat SD(1); // This is from @Manny code File file; void setup() { Serial1.begin(9600); _SPI.begin(); _SPI.setDataMode(SPI_MODE0); _SPI.setBitOrder(MSBFIRST); pinMode(lmp_hijau, OUTPUT); pinMode(lmp_merah, OUTPUT); radio.setSPI(&_SPI); radio.begin(); // Defaults 1Mbps, channel 0, max TX power radio.setRXaddress((void*)node); radio.enableRX(); } void loop() { char uid[33]; radio_state(radio.radioState()); while (!radio.available(true)); if (radio.read(uid)) { Serial1.print("Received packet: "); Serial1.println(uid); SD.begin(cs_sd); // Initialized sdcard when needed file = SD.open("18042018.txt", FILE_WRITE); if (file) { file.println(uid); file.close(); Serial1.println("done."); digitalWrite(lmp_hijau, HIGH); delay(200); digitalWrite(lmp_hijau, LOW); } else { Serial1.println("error opening file"); digitalWrite(lmp_merah, HIGH); delay(200); digitalWrite(lmp_merah, LOW); } } } void radio_state(uint8_t status) { Serial1.print("Enrf24 radio transceiver status: "); switch (status) { case ENRF24_STATE_NOTPRESENT: Serial1.println("NO TRANSCEIVER PRESENT"); break; case ENRF24_STATE_DEEPSLEEP: Serial1.println("DEEP SLEEP <1uA power consumption"); break; case ENRF24_STATE_IDLE: Serial1.println("IDLE module powered up w/ oscillators running"); break; case ENRF24_STATE_PTX: Serial1.println("Actively Transmitting"); break; case ENRF24_STATE_PRX: Serial1.println("Receive Mode"); break; default: Serial1.println("UNKNOWN STATUS CODE"); } }

Беннебой
Пн 20 февраля 2017 г., 19:55
Я взломал то же определение в Maple PGMSPace.H и компилятор становится дальше

Требуется дополнительное раскрытие.

Rogerclark
Пн 20 февраля 2017 г. 9:17 вечера
Обычно я просто удаляю все операторы ProgMem и вижу, какие ошибки компиляции я получаю.

(Как вы знаете, ProgMem имеет AVR -специфическую и не нужна для процессоров ARM, поскольку статические строки и данные либо автоматически помещают в Flash, либо вы можете помочь компилятору узнать, какие строки и т. Д. Не изменяются, объявив их как const)

Беннебой
Пн 20 февраля 2017 г., 21:39
На самом деле я не знал этого.

Беннебой
Пн 20 февраля 2017 г. 22:25
Я взломал все вещи Progmem и заменил функции PGMSPace на то, что, я думаю, их эквиваленты (правильно или неправильно).

Теперь компилятор говорит, что правда & Ложь не выделится лол???
12:41:19 : ST-LINK SN : 12:41:19 : V2J27S6 12:41:19 : Connected via SWD. 12:41:19 : SWD Frequency = 4,0 MHz. 12:41:19 : Connection mode : Connect Under Reset. 12:41:19 : Debug in Low Power mode enabled. 12:41:19 : Device ID:0x410 12:41:19 : Device flash Size : 64KBytes 12:41:19 : Device family :STM32F10xx Medium-density

Rogerclark
Пн 20 февраля 2017 г. 22:48
Есть некоторые различия в том, где определяются такие вещи, как «истинное»

Его определено в/stm32f1/cores/maple/plirish.H для нас

Беннебой
Пн 20 февраля 2017 г. 22:51
Да, все равно нашел проблему, что библиотека без памяти разбивала много определений. Удаленный.

Получил это для компиляции.

Необходимо потратить некоторое время на то, что именно эти функции PGMSPACE они просто заменяют кусочки струн, поэтому не должно быть слишком сложно выяснить.

Беннебой
Вт 21 февраля 2017 г. 9:53 утра
Компиляции и запуска до тех пор, пока он не попытается обработать какие -либо входы кнопок - подозревайте, что это либо потому, что указатели на то, что было в Progmem, стало сломано с помощью моих изменений, либо потому, что есть некоторые непревзойденные кнопки, когда не подключено фактическая схема кнопок.

Во всяком случае, спасибо за помощь, Роджер.

Если это оказывается кодом указателя, я могу попросить некоторую помощь еще раз, это не область силы для меня (особенно когда строки читаются в буферы и ссылаются как массивы чарсов & все в то время как упоминается через указатели).

Rogerclark
Вторник 21 февраля 2017 г. 20:26
Старые библиотеки могут быть болью для порта.

Что делает библиотека?

Довольно часто я в конечном итоге бросаю больше.

К сожалению, просто потому, что кто -то написал что -то как библиотеку, это не гарантирует, что код был хорошо написан.

В качестве примера мне нужен код для BME280 (датчик давления / температуры / влажности), поэтому использовал Adafruit Lib в качестве отправной точки. Но после того, как я, пока я понял, что библиотека была очень неэффективной, поскольку она делает несколько чтения в регистре температуры, когда ее следует читать только один раз (это потенциально дает небольшие ошибки при чтении давления и, как правило, замедляет вещи, а также в моем случае означает, что он требует большей мощности и выравнивает батарею)

Поэтому я закончил переписать большую часть кода, чтобы обеспечить лучшую точность, более быструю работу и меньше утечки аккумулятора.

Беннебой
Вт 21 февраля 2017 г., 21:57
Не нужна библиотека памяти, это зарегистрировано.

Получил гораздо дальше в отладке, и, в основном, код, который использует функцию strlcpy_p, - это бит, который сбивает STM32.

Мне нужно инвестировать несколько мозговых выступ...

По сути, это копирование содержимого определения строки, на которое ссылается на пользовательский класс в буфере. Я только далеко не так хорош с указателями, чтобы выяснить, как его снять.

Я доберусь туда, но пока это были дикие пробные и ошибки без какого -либо успеха... Комментируя, что линии оскорбления предотвращают сбои, но, очевидно, элементы меню не отображаются LOL.

Код нарушения: strlcpy_p - это бит, который сбои (вероятно, в сочетании с этим pgm_read_word, который не требуется.
rm0008 - cs32103 (chinese) chapter chapter context 2 1 document conventions / abbreviations 3 2 memory and bus architecture 4 3 CRC calculation unit 5 omitted! (power control PWR) 6 5 backup registers (BKP) 7 6 clocks and reset control (RCC) 8 omitted!: connectivity line devices: RCC 9 7 General-purpose and alternate-function I/Os (GPIOs and AFIOs) 10 8 Interrupts and events 11 10 Analog-to-digitalconverter (ADC) 12 11 Digital-to-analogconverter (DAC) 13 9 Direct memory access controller (DMA) 14 12 Advanced-controltimers (TIM1&TIM8) - only TIM1 is specifically mentioned in cs32f103 15 13 General-purpose timers (TIM2 to TIM5) (noted as TIMx in cs32f103 manual some chapters on timers are apparently omitted 18 14 Real-timeclock (RTC) 19 15 Independent watchdog (IWDG) 20 16 Window watchdog (WWDG) 21 omitted! Flexible static memory controller (FSMC) 22 omitted! Securedigital input/output interface (SDIO) 23 17 Universalserial bus full-speed device interface (USB) 24 18 Controller area network (bxCAN) 25 19 Serialperipheral interface (SPI) . 26 20 Inter-integrated circuit (I2C) interface 27 21 Universal synchronous asynchronous receiver transmitter (USART) 28 omitted! USB OTG 29 omitted! Ethernet 30 22 Device electronic signature 31 23 Debug support (DBG) .

Стивестронг
Вт 21 февраля 2017 г. 22:08
Используйте strlcpy и Delete pgm_read_word.

Беннебой
Вт 21 февраля 2017 г., 22:21
У нас есть победитель, спасибо, Стив!

Теперь, чтобы преобразовать его из использования ЖК -библиотеки в OLED, чтобы я мог видеть, что на самом деле происходит, должно быть довольно просто.

8-)

Беннебой
Чт 23 февраля 2017 г. 15:56
Некоторые проблемы с этим, я думаю, что код чтения кнопок может иметь проблему с 8 битом до 32 бит, потому что он возвращает случайные значения для нажатых кнопок.

Чтение булавок непосредственно показывает свое правильное состояние, так что это не проблема проводки.

В любом случае, вот конструктор для кнопок, который использует внешнюю библиотеку:
$ st-flash read system.bin 0x1ffff000 2048 st-flash 1.5.1 2019-02-07T21:46:25 INFO usb.c: -- exit_dfu_mode 2019-02-07T21:46:25 INFO common.c: Loading device parameters.... 2019-02-07T21:46:25 INFO common.c: Device connected is: F1 Medium-density device, id 0x20036410 2019-02-07T21:46:25 INFO common.c: SRAM size: 0x5000 bytes (20 KiB), Flash: 0x10000 bytes (64 KiB) in pages of 1024 bytes

Беннебой
Чт 23 февраля 2017 г. 16:55
ОК сортировано....

Btns->смысл()


Также избавился от использования Strlcpy:

strlcpy (list_buffer, (char*) (menu_header+current_header), 21);

С помощью

menu_header [current_header]

Беннебой
Сб 25 февраля 2017 г., 17:43
Поразить еще одну проблему, с которой я борюсь.

Я думаю, что код наполняет, как он обрабатывает написание из серийных данных.

Я думаю, что это не так, так это то, что он временно хранит данные, которые будут записаны в пользовательском классе, который Malloc некоторой буферной памяти

Я подозреваю, что этот буфер прямо ссылается, то есть мне нужно изменить что -то, чтобы принять во внимание, что мы на STM32.

Во всяком случае, это то, что должно быть выплютно высасываться из серийного порта:

0x81 0x13 0xf7 0x81 0x0c

И это то, что на самом деле выходит:

0xc3 0x42 0x01 0x08 0x0e


Вот как определены эти данные $ export LD_LIBRARY_PATH=/home/mstempin/.arduino15/packages/STM32/tools/STM32Tools/1.2.0/tools/linux64/stlink/lib $ ~/.arduino15/packages/STM32/tools/STM32Tools/1.2.0/tools/linux64/stlink/st-flash read system.bin 0x1ffff000 2048 st-flash 1.5.1 2019-02-07T21:46:25 INFO usb.c: -- exit_dfu_mode 2019-02-07T21:46:25 INFO common.c: Loading device parameters.... 2019-02-07T21:46:25 INFO common.c: Device connected is: F1 Medium-density device, id 0x20036410 2019-02-07T21:46:25 INFO common.c: SRAM size: 0x5000 bytes (20 KiB), Flash: 0x10000 bytes (64 KiB) in pages of 1024 bytes

Беннебой
Сб 25 февраля 2017 г., 19:31
Скомпилирование исходного кода с 2560 результатами в рабочих коммуникациях в ECU :(

Rogerclark
Сб 25 февраля 2017 г. 20:15
Я не вижу никакого сходства или схемы различий между тем, что вы должны увидеть, и тем, что вы на самом деле получаете.

Это не похоже на байтовое обмена / эндсианство

Все, что должен делать код, это помещать CRC в последний байт.

Я бы порекомендовал вам написать функцию, которая печатает буфер для отладки, чтобы вы могли увидеть содержимое.

Затем вызовите эту функцию на разных этапах, если код увидит, когда буфер испортится.

Вполне возможно, что буфер перезаписал мою совершенно другую часть вас код.

Пса.
Для классов его хорошая практика, чтобы каким -то образом назвать переменные участника, чтобы сделать очевидным, что они являются участником (собственностью) класса E.глин. Обычно я использую подчеркивание в начале VAR, так как это общая номенклатура (конечно, есть другие номенклатуры)

Беннебой
Сб 25 февраля 2017 г. 8:24
ОК, получил это работа....

Строка Memcpy была проблемой, удаление кода ProGMEM изменило состояние подаваемых данных в...
gcc-arm-none-eabi-6-2017-q1-update/bin/arm-none-eabi-objcopy --input-target=binary --output-target=elf32-little CS32_bootloader_dump.bin CS32_bootloader_dump.elf

Rogerclark
Сб 25 февраля 2017 г. 20:29
Bennehboy ​​написал:ОК, получил это работа....

Строка Memcpy была проблемой, удаление кода ProGMEM изменило состояние подаваемых данных в...
void setup() { Serial.begin(115200); } void loop() { delay(1000); Serial.println("hello"); }

Беннебой
Сб 25 февраля 2017 г. 20:30
Rogerclark написал: Для классов его хорошая практика, чтобы каким -то образом назвать переменные участника, чтобы сделать очевидным, что они являются участником (собственностью) класса E.глин. Обычно я использую подчеркивание в начале VAR, так как это общая номенклатура (конечно, есть другие номенклатуры)

Беннебой
Сб 25 февраля 2017 г. 20:34
Rogerclark написал: Кстати.

Я не видел никаких операторов Progmem в опубликованном вами коде.

Я думаю, что мы, вероятно, звучат как записи Suck, но лучше всего удалить все операторы Progmem из кода, потому что они являются только устаревшим элементом AVR, и хотя у STM32 есть несколько макросов, чтобы попытаться разрешить их использование; макросы не работают для каждого возможного способа, которым указатели можно использовать в C

VGA Space Invaders на Bluepill