Jump to content
Sign in to follow this  
rmatveev

Идентификация прошивок

Recommended Posts

Друзья, мне бы хотелось как-то начать "метить" прошивки, которые я заливаю в устройства на этапе разработки.

Когда-то давно, когда я еще кодил для МК51 и PIC я использовал несколько ячеек в начале памяти программ, куда автоматом записывал закодированную дату. Но это я делал с помощью своей утилиты - при компиляции я запускал свой батник, который во-первых формировал небольшой ассемблерный файлик с кодом даты, он уже линковался к основному коду и получалось у меня что-то типа такого:

            ORG          0000h
            goto         Begin

            include      'date.src'

            retw         __day
            retw         __month
            retw         __year

            ORG          0004h
            goto         INTERRUPT

Файл date.src формировался моим батником, там присваивались значения макросам __day, __month и __year.

Это ассемблер для PicMicro. Я использовал тот факт, что у него между началом пользовательского кода и единственным вектором прерывания было 4 байта, в первый байт я вставлял команду перехода на начало, а в три оставшихся байта - дату. Она была хорошо видна при считывании кода из чипа. Было очень удобно потом идентифицировать прошивку, т.к. исходники я тоже сохранял по датам. В общем, такая была доморощенная система контроля версий. Было это году в 2000-м.

Сейчас я пользуюсь Atollic TrueStudio и MBED и тоже задумался о том, как мне помечать прошивки. Может быть есть какие-то штатные способы? Или может по старинке найти в коде место, куда зашивать дату что бы ее легко было видно при считывании прошивки в ST Link Utility?

Спасибо заранее за любые мысли.

Share this post


Link to post
Share on other sites

Сразу после KEEP(*(.isr_vector)). 

. = ALIGN(0x200);
    KEEP(*(.text.METAINFO))
    . = ALIGN(4);

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

Share this post


Link to post
Share on other sites
23 минуты назад, AVI-crak Home сказал:

Сразу после KEEP(*(.isr_vector)). 

. = ALIGN(0x200);
    KEEP(*(.text.METAINFO))
    . = ALIGN(4);

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

А это в каком файле? Что-то пока ума не приложу где это. Вы не приложите скрин?

Share this post


Link to post
Share on other sites

Литиевые ХИТы Fanso: устойчивость к высоким температурам

Литиевые ХИТы для широкого круга применений, в том числе в промышленности, соответствуют требованиям современного рынка и способны работать в самых жестких условиях. Основные требования – это длительность хранения и работы, высокая удельная емкость, а также защита от воздействия таких внешних факторов, как температура и влажность. ЛХИТ превосходят по плотности энергии и нормальному напряжению другие элементы автономного питания: 2,9…3,6 В против 1,2…1,5 В

Читать статью...

Posted (edited)

Это скрипт линкера *.ld, вот только это запись секции, для записи файла нужно еще в этой секции прикрепить нужный файл (на асме в стартапе). Типа такого:

  .section  .Bootloader,"a",%progbits
  .type  Bootloader_os, %object

Bootloader_os:
  .incbin "123.bin"

  .size  Bootloader_os, .-Bootloader_os

И теперь уже сохранить секцию .Bootloader

    . = ALIGN(4);
    KEEP (*(.isr_vector))   /* сохранили таблицу векторов */

    . = ALIGN(4);
    _myID_Adr = .;
    KEEP (*(.Bootloader))     

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

Все под Atollic

Edited by MasterElectric

Share this post


Link to post
Share on other sites
Posted (edited)

Можно еще использовать стандартные макросы типа: __DATE__ __TIME__ примерно так:

__attribute__ ((section (".Bootloader"))) uint8_t aDate[] = __DATE__;
__attribute__ ((section (".Bootloader"))) uint8_t aTime[] = __TIME__;

На выходе имеем:

080001ac <aTime>:
 80001ac:	31 33 3a 34 36 3a 35 33 00 00 00 00                 13:46:53....

080001b8 <aDate>:
 80001b8:	4d 61 72 20 32 38 20 32 30 31 39 00                 Mar 28 2019.

 

Edited by MasterElectric

Share this post


Link to post
Share on other sites

ESP32-DevKitC-VB позволит быстро запустить ваше первое WiFi-приложение

Отладочная плата на основе одного из самых популярных WiFi-модулей Espressif ESP32-WROVER-B позволяет в самые короткие сроки запустить приложение с поддержкой беспроводных стандартов WiFi 802.11b/g/n и Bluetooth Classic/BLE. Ресурсов встроенного в модуль чипа ESP32-D0WD хватит для решения даже очень сложных задач.

Подробнее...

Guest rmatveev
4 часа назад, MasterElectric сказал:

Можно еще использовать стандартные макросы типа: __DATE__ __TIME__ примерно так:


__attribute__ ((section (".Bootloader"))) uint8_t aDate[] = __DATE__;
__attribute__ ((section (".Bootloader"))) uint8_t aTime[] = __TIME__;

 

Круто!

А куда этот код нужно встраивать?

Share this post


Link to post
Share on other sites

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
Sign in to follow this  

  • Similar Content

    • By katet
      Добрый день. Может быть,кто-нибудь уже сталкивался с таким. 
      Занимаюсь доработкой чужого проекта в среде STM32CubeMX, первый раз работаю с библиотекой HAL.
      В этом проекте осуществлялся прием байт по USART1 из ComMon. Проект был открыт в STM32CubeMX, где мной дополнительно были активированы новые модули - RTC, SD, USART2. Настройки USART1 не менялись. 
      Часы реального времени RTC: питание от батарейки, тактирование – от LSE. 
      При приеме байт по USART1 в новом проекте (активны  USART1, RTC, SD, USART2) было выявлено, что после приема 2 байт по USART1 перестает инкрементироваться значение переменной uwTick, отвечающей за прерывания Systick, в результате чего дальнейшая отладка невозможна. Не удается выяснить, в каком месте и почему перестает увеличиваться значение uwTick. При работе со старым проектом (где активен только USART1) uwTick инкрементируется после приема 2 байт.
      Смены приоритета прерываний не происходит, в  функцию HAL_Delay() отладчик не попадает. При вызове функции HAL_ResumeTick(), возобновляющей прерывания Systick, ничего не меняется, значение uwTick остается неизменным.
      Остановка прерываний была обнаружена при попадании в функцию:
      static HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_t Flag, FlagStatus Status, uint32_t Tickstart, uint32_t Timeout)
      {
        /* Wait until flag is set */
        while((__HAL_UART_GET_FLAG(huart, Flag) ? SET : RESET) == Status) 
        {
          /* Check for the Timeout */
          if(Timeout != HAL_MAX_DELAY)
          {            
            if((Timeout == 0U)||((HAL_GetTick() - Tickstart ) > Timeout))
            {
              /* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts for the interrupt process */
              CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_TXEIE));
              CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);
              
              huart->gState  = HAL_UART_STATE_READY;
              huart->RxState = HAL_UART_STATE_READY;
              
              /* Process Unlocked */
              __HAL_UNLOCK(huart);
              
              return HAL_TIMEOUT;
            }
          }
        }
        
        return HAL_OK;
      }
      В новом проекте текущее значение uwTick, возвращаемое функцией HAL_GetTick(), всегда равно значению Tickstart. В старом проекте сначала также, но затем uwTick начинает увеличиваться. Выяснить, в каком именно месте кода значение uwTick должно начать увеличиваться, не удается.
      Может быть, у кого-нибудь есть хоть какие-то идеи, с чем может быть связана остановка увеличения значений uwTick, помогите пожалуйста)
      Распиновка и конфигурация обоих проектов: верхняя часть рисунков - первоначальный, работающий вариант,  нижняя - сбой прерываний Systick.


    • By _qwerty
      Добрый день. Продам
      отладочные платы для STM32
      Отладочная плата на базе MCU STM32F429ZIT6 (ARM Cortex-M4) - 2600 р. В наличии 2 шт. Отладочная плата на базе MCU STM32F407VGT6 (ARM Cortex-M4) - 1600 р. В наличии 2 шт. Отладочная плата на базе MCU STM32F303VCT6 (ARM Cortex-M4) - 1200 р. В наличии 2 шт. Отладочная плата на базе MCU STM32F103RBT6 (ARM Cortex-M3) - 1000 р. В наличии 2 шт. образовательный набор Амперка Tetra для обучения детей прикладному программированию на основе визуального языка Scratch - 4500 р. В наличии 2 шт.
      электронный конструктор БХВ-Петербург Дерзай 36608 Стартовый набор Arduino - 1500 р. В наличии 2 шт.
      Все новое, не использовалось, возможна отправка почтой по России


















    • By ChaNger16ua
      Здравствуйте, недавно начал заниматься stm32, до этого занимался только Arduino/AVR. Купил себе плату с чипом STM32F103C8T6, и программатор ST-Link v2.
      Сразу же начал искать себе подходящую IDE, остановил свой выбор на CoIDE. И когда начал, проблем с загрузкой, и компиляцией программы не было, управлял всем через регистры, и радостно мигал светодиодом, но когда решил проверить как работает отладка, столкнулся с проблемой. При запуске отладки проект компилировался и загружался, но сама отладка выдавала ошибку: Cannot execute this command without a live selected thread. Перерыл весь интернет, ничего не помогло. 
      Взял уже пример с миганием светодиода из библиотеки GPIO, поменял название функции на int main, поставил return, и дописал строку которая включает SWD. Вот сам код:
      #include "stm32f10x.h" #include "stm32f10x_gpio.h" #include "stm32f10x_rcc.h" int main(void) { int i; /* Initialize Leds mounted on STM32 board */ GPIO_InitTypeDef GPIO_InitStructure; /* Initialize LED which connected to PC6,9, Enable the Clock*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); /* Configure the GPIO_LED pin */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE); while (1) { /* Toggle LEDs which connected to PC6*/ GPIOC->ODR ^= GPIO_Pin_13; /* delay */ for(i=0;i<0x100000;i++); } return 0; } Запускаю, и ничего та же ошибка.
      После решил сам все не делать, а создать проект в STM32CubeMX. Делал по многим примерам(код кидать не буду он стандартный). Правильно настраивал порты, в пинах sys выставил значение Serial Debug, выставил тактирование. Кидаю проект, все правильно выставляю(папки Drivers, Src, Inc), потом в конфигурации во вкладке компилятор, выставляю переменные. Компилирую, выдает такую строку:
      Program Size: text data bss dec hex filename 0 0 0 0 0 NewMain.elf тоесть программы по сути нет, это в настройках линкера во вкладке options стоит галочка на: Use memory layout from memory window.
      Окей знаю что линкер просто не подключает нужные библиотеки и файлы, поэтому программа ничего не весит.
      Снимаю галочку, ставлю Scatter file, который сделала STM32CubeMX, запускаю.
      Дальше выдает ошибку, но не компиляции, вылазит окно Problem Occurred, нажимаю details, там такое:
      An internal error occurred during: "Building". String index out of range: -1 И все, компиляция прервана. НО если очистить проект, и потом сбилдить(либо ребилд), то работает, но заветный светодиод не моргает.
      Дальше касательно отладки, в нее не могу зайти, потому что при отладке проект компилируется, но я его не могу скомпилировать, могу перебилдить, и поэтому отладка тупо не включается, но есть я очищу проект, то отладка просто не работает.
       
      P.S перемычки на плате менял, как угодно, и с одной прошивкой и другой, не работает. Пытался освоить uVision, не пошло, куча проблем с ней, хотя уже и по гайдам делал(по нескольким), и сам все пытался. Но в итоге как не работало, так и не работает.
      Поэтому прошу помощи.
    • By IgnatiusF
      Не удается проинициализировать работу UART2 на скорость 19200 бод.
      Не вызывается прервание совсем, отсылаются постоянно нули на всех скоростях, если ставить System clock switch в 01 (HSE). При работе от RC генератора выдает уже просто не то, что нужно. 
      Кварц рабочий, и вообще все работает, при использовании библиотек HAL.
      SysTick выключил потому, что были подозрения на конлфикт приоритетов.
      Внизу представлена именно та часть кода программы, которая не работает, то есть сам UART.
      Проект скоро сдавать, а использовать готовую библиотеку HAL не хочется совсем, уже несколько дней парюсь и не могу найти проблему. Попробовал разобраться что пишет в регистры HAL, однако не смог т.к. не хватает знаний, значения регистров все такие же, кроме PLL (не используется) и RCC_CR1 (в HAL почему-то полностью равен 0). Проверял передачей данных по UART. Регистр BRR не удалось считать т.к. он только для записи. У меня записано так:
      USART1->BRR = 0x412;  //20MHz/16/19200 = 65,104.
      Где искать следует ошибку?
    • By small girl
      Привет, ребят! Кто возьмется написать на С протокол взаимодействия для сети микроконтроллеров. База: STM32 с bluetooth модулем HC-06,- slave. ПК - master?

      За вознаграждение
  • Сообщения

    • Жопа с занавесками.
    • Ты просто самый обычный клоун. Городской дурачок.  
    • Не все люди это знают.   Сейчас нет у народа такого права.   Этого тоже нет, ни выборов, ни референдумов.   По закону не может, но у нас при путине никакие законы не выполняются.))   Поэтому без крайних мер никак не обойтись. 
    • Я честно отмотал тему до 30 страницы. Последняя представленная схема дана страниц 5 назад. Глубже уже другие схемы. Такое ощущение, что автор схемы чувствует, что есть зерно в утверждениях @geran и умышленно не выполняет просьбу, которая расставит все точки над i.   Стоп, машина! Мы обсуждаем частотный демодулятор. Огибающая в данном контексте является помехой (без оглядки на ее происхождение) и ее необходимо исключить. На вход предоставленной схемы мы подаем частотно модулированную несущую, перенесенную на промежуточную частоту. АМ модуляция в ней только для демонстрации возможностей демодулятора. Никакой полезной информации она нести не должна. я хоть по образованию и радиотехник, но вот цифра мне ближе)) Радиоприемники ограничиваются мной радиотрансиверами для передачи цифровой информации. Данная тема интересна после заявления об однобитном демодуляторе. Я решил, что здесь НИР проводится или диссертация какая. Оказывается, за однобитность преподносится однотактность. Если я правильно разобрался в сраче.... Видимо, я не смог удержать нить разговора и решил. что речь про режекторный фильтр. Ведь изначально фокус внимания на нем был.
    • Ага, ну понятно, еще бы... Да, тебе пора бежать за шнобелевкой,  у тебя огибающая синфазна с выходов обоих диодов и складывается, а где S-КРИВАЯ, брателло? У тебя там нет S-КРИВОЙ. И с какого рожна этот мутняк должен называться ЧМ-детектор?
    • Не, брат. Тут ты поспешил. Скоро и в попу им дашь? Не, не серьёзно это. Давайте соблюдать конституцию РФ! Все вместе, и дружно!? Для начала, на осознание вам вот статейка оттуда.   Статья 3 1. Носителем суверенитета и единственным источником власти в Российской Федерации является ее многонациональный народ. 2. Народ осуществляет свою власть непосредственно, а также через органы государственной власти и органы местного самоуправления. Усвоите- пишите. чава какава. 3. Высшим непосредственным выражением власти народа являются референдум и свободные выборы. 4. Никто не может присваивать власть в Российской Федерации. Захват власти или присвоение властных полномочий преследуется по федеральному закону.
×
×
  • Create New...