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

TOG

Свой
  • Постов

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

  • Посещение

Сообщения, опубликованные TOG


  1. 34 minutes ago, jcxz said:

    Может и делает. Для того .hex и нужен.

    PS: И вообще - странный вопрос. Вроде должно быть очевидно, что иного ответа в принципе быть не может. Попробуйте подумать почему.

    Не так уж это и очевидно.

    Я немного поэкспериментировал с размещением RO-данных в прошивке. Например делаю размещение данных ближе к концу флэш памяти и вот как компилятор создает HEX-файл:

    :020000040801F1
    :1068000004133443000000000000000000000000FD
    :020000040801F1
    :106810000408010F0000000000000000000000006E
    :020000040801F1
    :106820000429000000000000000000000000000036
    :020000040801F1
    :10683000A0D202F9A377C00000000000000000003F

    Хоть фактически данные размещаются непрерывно (0x08016800, 0x08016810, 0x08016820, 0x08016830), но компилятор дополнительно снабдил их все адресом сегмента 0x0801 (хоть сегмент и не меняется).

    А если разместить RO-данные ближе к началу флэш памяти, то HEX-файл представляет единый монолит: Вначале объявлен адрес сегмента и дальше все данные идут по порядку до самого конца.

  2. Товарищи,

    делаю бутлоадер и немного затупил с форматом HEX-файла.

    После первой строки с адресом сегмента (сегмент 0x1000 в данном примере), обязательно ли компилятор размещает данные в HEX-файле непрерывно в пределах одного сегмента памяти ?

    Тут в примере данные размещены непрерывно по адресам:

    0x1000C200  (16 байт данных E0A5E6F6FDFFE0AEE00FE6FCFDFFE6FD)

    0x1000C210  (16 байт данных FFFFF6F50EFE4B66F2FA0CFEF2F40EFE)

    0x1000C220  (16 байт данных F04EF05FF06CF07DCA0050C2F086F097)

    0x1000C230  (16 байт данных F04AF054BCF5204830592D02E018BB03)

    А мог бы он скажем после адреса 0x1000C210 вместо адреса 0x1000C220 поставить какой-то другой адрес(например 0x1000D000) ? Мало ли как там программист разместил RO-данные в программе. 

    Или при появлении разрыва в данных в HEX-файле обязательно появится запись с объявлением сегмента (типа :020000021000EC) ?

     

    :020000021000EC
    :10C20000E0A5E6F6FDFFE0AEE00FE6FCFDFFE6FD93
    :10C21000FFFFF6F50EFE4B66F2FA0CFEF2F40EFE90
    :10C22000F04EF05FF06CF07DCA0050C2F086F097DF
    :10C23000F04AF054BCF5204830592D02E018BB03F9
    :00000001FF
  3. Сделал. Почитал Джозефа Ю.

    Загрузил в стек нужные значения:

    0xFFFFFFF9 (EXC_RETURN),

    0x00000000 (R0),

    0x00000000 (R1),

    0x00000000 (R2),

    0x00000000 (R3),

    0x00000000 (R12),

    0xFFFFFFFF (LR),

    AppAdr+1 (PC) (Адрес приложения),

    0x010000000 (xPSR.ThreadMode = 1)

    и далее команда POP {PC} делает все остальное.

     

  4. On 3/27/2024 at 12:24 PM, jcxz said:

    3. Сделать все необходимые дела в ISR. Кто мешает вам так сделать? Вроде как всё элементарно.

    Немного я затупил.

    Когда я делаю переход из обработчика прерывания в другое приложение, то флаг в "Interrupt Active Bit Register" остается висеть "Active".

    Получается, что я НЕ вышел из обработчика прерывания. И как результат, после перехода в другое приложение прерывание таймера не срабатывает, т.к. процессор думает, что мы из обработчика еще не вышли.

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

    Объясните пожалуйста на пальцах для тупого. 

  5. 2 minutes ago, jcxz said:

    2. Выключить её в соответствующем сервисе ОС (например в сервисе SVC).

    3. Сделать все необходимые дела в ISR. Кто мешает вам так сделать? Вроде как всё элементарно.

    Понял. Спасибо, jcxz !

  6. 8 minutes ago, jcxz said:

    Чтобы "запустить другое приложение", изменить MSP скорей всего будет недостаточно. В идеале нужно предварительно вообще все регистры ядра и периферии перевести в исходное (послесбросовое) состояние.

    Это я знаю. Бутлоадер делать умею. И по такому же принципу хотел запустить другое приложение. (Сброс тактирования, установка VTOR, MSP и переход на новый адрес).

    Как из под контроля FreeRTOS выбраться, ? вот вопрос.

  7. 6 hours ago, haker_fox said:

    Вопрос именно в том: для чего?

    Надо запустить другое приложение. Типа как бутлоадер запускает основное приложение.

    PC меняется, VTOR тоже, а MSP не меняется(выше мне объяснили почему).

    18 hours ago, Arlleex said:

    По теме: после старта ОС переводит CPU в непривелигированный режим, поэтому просто так менять значение MSP нельзя.

    Может из оси можно выйти ? Типа завершить работу, попасть снова в main и от туда уже передать управление другому приложению ?

  8. Товарищи,

    Проект на STM32H743,  FreeRTOS.

    Ось похоже отслеживает состояние регистра MSP и из задачи не удается изменить содержимое MSP. Значение не меняется.

    (До запуска оси регистр MSP из программы меняется спокойно).

    Подскажите пожалуйста, что, где покрутить ?

  9. Уважаемые форумчане.

    Чисто из академического интереса, не корысти ради спрашиваю.

    Есть в интернете известные методики считывания прошивок из защищенных первым уровнем МК STM32F1xx. Через FPB очень лихо все получается. На ревизии Z прекрасно все считывается.

    Но в ревизии "A",  ST исправили эту уязвимость и  методика FPB не срабатывает. 

    Может кто что подскажет ?

  10. 17 hours ago, kan35 said:

    И я уверен, что контроллер потенциально зайдет много куда, но меня две вещи беспокоят - получится ли снизить цену хотя бы рублей до 200 и будет ли стабильным качество… ну и еще вопрос конечно - сможет ли Микрон нашлепать миллионы Амуров в год… 

    Если в следующей версии они сделают защиту прошивки, то может и зайдет.

  11. Товарищи,

    есть в программе структура типа такой:

    typedef struct {                                                                                          
    uint8_t  Cnt;                                                                                               
    float    Len;                                                                                           
    float    Depth;                                                                                          
    uint8_t  Roll;                                                                                            
    float    Pitch;                                                                                            
    uint8_t  Hours;                                                                                            
    uint8_t  Minutes;                                                                                          
    uint8_t  Day;                                                                                              
    uint8_t  Month;                                                                                            
    uint8_t  Year;                                                                                             
    } LOG_Type;  

    Если посчитать, то получается размер 19 байт. Но если использовать sizeof(LOG_Type), то получается 28 байт. 

    Посмотрел в памяти и увидел, что компилятор все float'ы выровнял по границе 4 байт.

    А мне эту структуру надо отправлять по SPI побайтно и все эти лишние нули мне совсем не нужны.

    Как быть ?

     

  12. Кажись победил. Стек программы я отслеживал, а вот переполнение FreeRTOS'ного стека прошляпил. Я тупо смотрел на галочку CHECK_FOR_STACK_OVERFLOW = Option1 думая, что если будет переполнение, то она там в ловушке застрянет.

    Однако обработчик переполнения стека оказался без "while(1) {}":

    void vApplicationStackOverflowHook(xTaskHandle xTask, signed char *pcTaskName)
    {
    }

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

     

    Есть ли в Keil MDK-ARM функции для отслеживания FreeRTOS задач и прочий функционал для отладки под ОС ?

    У меня меню Debug / OS Support / System and thread viewer выдает пустое окошко. 

  13. Спасибо всем за советы.

    Был совершенно рабочий проект, потом добавил еще одну очередь(Queue) размером 19 байт и всё посыпалось. То HardFault, то разрушение стека. Может проработать несколько минут или несколько секунд и глюкануть.

    Причем это разрушение стека больше напоминает полную порчу всей оперативки, там огромные области забиты 0xFF, а в других областях полный хаос(как после сброса питания).

    У меня есть подозрение, что закончилась память выделенная FreeRTOS: TOTAL_HEAP_SIZE = 32768 байт.  Потому-что если я отключаю в программе совершенно безобидные функции, то глюки изчезают.

    Есть ли способ понять, сколько там в куче свободного места ?

    Проект сделан на: Keil ARM-MDK, CubeMX, TouchGFX.

  14. Товарищи,

    есть проект на STM32H743 под FreeRTOS 2.0. Стал периодически улетать в HardFault. Где посмотреть по какому адресу возникло исключение ?

    Перебрал все адреса, что находятся в стеке, они все ведут куда-то в дебри FreeRTOS'a. Но исключение же вызывает мой код. Как до него-то добраться ?

  15. On 10/30/2023 at 12:27 AM, mantech said:

    Не факт. Были случаи с процом IMX6, что он "защелкивался", т.е. по линии 3В было КЗ. Брал никелькадмиевые 3шт аккума от шурика, заряжал их и кратковременно(импульсами по 0.1-0.2сек штук 5-7) подавал питание на эту линию 3В и общую, из 10 плат при таком методе "восстановления", 3 платы стали работать

    Круто придумано. А какова физика этого целебного эффекта ? Куда делось КЗ ?

  16. On 10/31/2023 at 8:46 PM, selax said:

    Ну у НИИЭТа не вся продукция отвалилась, на сколько мне известно он свои новые МК как то поставляет, хоть и с большими сроками. Я надеюсь, что они таки смогли перейти на китайские фабрики.

    Если оторвать наклейку с корпуса их МК, то под наклейкой GigaDevice. Уже проверили.

×
×
  • Создать...