Перейти к содержанию
    

simark1979

Участник
  • Постов

    94
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о simark1979

  • Звание
    Частый гость
    Частый гость
  • День рождения 24.11.1979

Информация

  • Город
    Array

Посетители профиля

1 977 просмотров профиля
  1. Извините, с телефона не разглядел. Конечно знаю)
  2. Я извиняюсь, возможно не совсем четко сформулировал проблему. Задача ведь не только в том, чтобы правильно разместить по адресу, но и вычитать С размещением переменных я Вас понял, размещаем в именованной секции. Подскажите как теперь её вычитать. А как вычитать теперь её?
  3. Сейчас обнаружил, дело в том, что пока я сейчас я кладу и читаю из одной и той же программы (для простоты отладки) Прикол в том, что если я пытаюсь вычитать её по другому адресу, допустим так __no_init fw_version_t mainApp_fw_info @ 0x0807fffa; линкер переменную запихивает по другому адресу. (Обратите внимание данные сместились, в переменной опять лежат ff, но пока не смотрел откуда они туда попадают. То ли это нельзя делать из одной и той же программы, то ли я что-то не понимаю. Я то думал, что адрес в __no_init fw_version_t mainApp_fw_info @ 0x0807fffa; влияет только на адрес чтения, а оказывается и на адрес размещения тоже, несмотря на спецификатор __no_init
  4. Всем привет. Помогите разобраться с размещением/чтением структуры из флэш по абсолютному адресу. Задача получить доступ к структуре из основной программы, размещенной бутлоадером. (короче, основная программа хочет знать версию бутлоадера) Итак по порядку // 1. Определена структура typedef struct { uint8_t major; uint8_t minor; } fw_version_t; // 2. Объявлена переменная #pragma location = "FW_INFO" __root const fw_version_t app_version = { .major = 2, .minor = 8, }; // 3. В линкере определена область FW_INFO /* Размер секции для хранения структуры c информацией о версии прошивки, она размещается перед контрольной суммой прошивки*/ define symbol __FW_INFO_size__ = 4; define symbol __FW_INFO_start__ = __CRC32_addr__ - __FW_INFO_size__; define symbol __FW_INFO_end__ = __CRC32_addr__; define region FW_INFO_region = mem:[from __FW_INFO_start__ to __FW_INFO_end__]; place in FW_INFO_region { readonly section FW_INFO }; // 4. После прошивки переменную вижу во флэш В *.map следующая запись "P3": place in [from 0x807'fff8 to 0x807'fffc] { ro section FW_INFO }; // 5. Объявляю переменную по абсолютному с абсолютным адресом указанным в map файле. __no_init fw_version_t mainApp_fw_info @ 0x0807fff8; ---------------------------------------------------------------------------------------------------- Но в результате в структуре оказываются не те значения, которые ожидались. в mainApp_fw_info.major читается 0xff из 0x0807fff8 в mainApp_fw_info.minor читается 0xff из 0x0807fff9 Я так понимаю, неправильно разместил структуру или её читаю. Подскажите, что сделал не так?
  5. Вялотекущий топик) Спасибо, я уже поставил библиотеку g8u2 и делаю меню на базе micromenu.
  6. Спасибо, подскажите, а на маленьком монохромном экране использовали? Смотрю, либа в основном на цветных тачах используют....у меня кнопки...
  7. Я действительно никогда не пользовался гитхабовским поиском, даже в голову не приходило.... Огромное спасибо за подсказку и ссылки)
  8. Пытаюсь разобраться с micromenu-v2, идет туго. Никакой документации. Ни у кого случайно не завалялся любой собираемый проект с меню под IAR/KEIL для любого stm32?
  9. Спасибо, сейчас буду разбираться
  10. Всем привет) К stm32 прикрутил glcd с разрешением 128*64 и библиотеку u8g2. Теперь встал вопрос по созданию меню. Когда-то для строчного экрана писал меню сам, но получилось довольно громоздко. Поделитесь опытом, кто как делал меню, может посоветуете готовые библиотеки. Гугление особо ничего не дало, кроме ардуинных решений особо ничего не накопал.
  11. Из моего поста не следовало, что я им не пользуюсь, пользуюсь уже лет 6-7 (ранее github, теперь gitlab) Я вас наверное удивлю, многие действительно не используют и более того не знают об этом. Некоторые не могут освоить смартфоны, некоторые до сих пор только на ассемблере пишут, Люди разные и способность к обучению с возрастом теряется.
  12. Не понятно, чего Вы пристали к месту и способу резервирования данных. Хоть на флэшку, хоть на HDD, хоть на SSD, хоть в git/svn. Какое это имеет значение в конце концов, пост был о другом.
  13. Во-первых, нет), а во-вторых - использование систем контроля версий не гарантирует, автоматические коммиты)
  14. После открытия для себя функций по работе с группами бит, вот что придумалось: В потоке вызываем xEventGroupWaitBits() с бесконечным ожиданием. Чтобы проскочить эту функцию, нужно выставить все биты в группе. Каждый контролируемый поток с помощью xEventGroupSetBits должен выставить свой уникальный бит в группе. Перед возвратом из xEventGroupWaitBits(), все биты в группе сбросятся автоматом. Таким образом нужно, чтобы все функции: (watchdog_taskAlive__ui(), watchdog_taskAlive__ph_sensor_reader(), watchdog_taskAlive__rx_sensor_reader()) были вызваны хотя бы один раз. Чем чаще будут вызовы этих функций, тем сильнее можно сократить реакцию на зависание. В зависимости от конфига FreeRTOS, в одну группу можно запихать до 32-х бит. по умолчанию CubeMx так и делает, если этого недостаточно, делайте иерархию из групп. Код не оптимизирован для наглядности) #include "watchdog.h" #include "stm32f2xx_hal.h" #include "stm32f2xx.h" #include "stm32f2xx_it.h" #include "cmsis_os.h" #include "string.h" #define BIT_0 ( 1 << 0 ) #define BIT_1 ( 1 << 1 ) #define BIT_2 ( 1 << 2 ) EventGroupHandle_t xTasksWatchdogEventGroup; void task_Watchdog_control(void const * argument) { MX_IWDG_Init(); xTasksWatchdogEventGroup = xEventGroupCreate(); for(;;) { xEventGroupWaitBits( xTasksWatchdogEventGroup, /* The event group being tested. */ BIT_0 | BIT_1 | BIT_2, /* Здесь перечисляем какие биты ждем */ pdTRUE, /* Указываем, что при выходе из функции, биты нужно сбросить */ pdTRUE, /* Указываем, что возврат из функции произойдет, только после выставления всех битов*/ portMAX_DELAY ); /* Выставление битов ждем бесконечно долго */ HAL_IWDG_Refresh(&hiwdg); } } void watchdog_taskAlive__ui() { xEventGroupSetBits(xTasksWatchdogEventGroup, BIT_0);} void watchdog_taskAlive__ph_sensor_reader(){ xEventGroupSetBits(xTasksWatchdogEventGroup, BIT_1);} void watchdog_taskAlive__rx_sensor_reader(){ xEventGroupSetBits(xTasksWatchdogEventGroup, BIT_2);}
×
×
  • Создать...