Jump to content

    

Gradient

Участник
  • Content Count

    632
  • Joined

  • Last visited

Community Reputation

0 Обычный

About Gradient

  • Rank
    Знающий

Recent Profile Visitors

3285 profile views
  1. Ксения, я нашел и прочитал всё что было по этой теме в сети. И это сообщение в том числе. К сожалению никакие "костыли" не помогли в том числе и Zadig (это работает только для avrstudio). IAR вообще отморозился каким-то бесполезным > бредом. Суть там такая - "купите у нас еще, ваше уже старое". Никакие перестановки, добавки, замены драйверов и dll не помогли. Затем пришлось оттрассировать вызовы, что привело к avrjtagice-mkII.dll откуда в ide возвращался код: Под Win 7: 0x00000000, те под 7й всё тоже самое работает успешно. Под Win10: 0x20000009 Затем пропатчил avrjtagice-mkII.dll чтоб возвращался "правильный" код 0, но это не привело к успеху, тк наступал крэш на следующей операции. Отсюда понятно, что драйвер не был загружен. Решил проблему просто - открыл PC, нашел на маме UART порт, подключился туда, разъём воткнул в mkII. Всё работает... медленнее, но этого достаточно чтоб залить код в плату. :(
  2. nRF52 BLE SDK (Cortex M3) SVC

    Нет. Быстрее было сделать своё. На дальнейшее общение с "Быстрыми финскими парнями" моего терпения не хватило. :) Теперь это их проблема. Кстати, найдите телефончик и потесните, тык сказать чтоб потом сюрпризов не было.
  3. nRF52 BLE SDK (Cortex M3) SVC

    Оно всё прекрасно... пока у вас нет масспродакшена. На тот момент что я с их говноподелкой воевал, не коннектилось что-то к 10е моделей смартфонов (но я об этом ещё не догадывался). Потом специально купил за свои деньги одного из них на опыты: Samsung Galaxy J1 (2016). И как я этих мудаков не пинал, так они ничего и не сделали, мычали как бараны оттуда. А нам в обратку тем временем, вкатили около 600 возвратов погремушек, потому что игрушка уже пошла в продажу. И как назло этих проблемных смартфонов напродавали в регионе десяток вагонов. Вот оно счастье было всем! Поэтому - "за борт" этот Норвежский цирк с индусами! Нельзя закладывать их sdk в коммерческий продукт. Да вообще - любую либу, если вы не можете оперативно влиять на её функционирование самостоятельно. Не помню давал ссылку или нет на > приспособу Вот это специально сделал и протокол отлаживал... пользуйтесь кому на здоровье.
  4. nRF52 BLE SDK (Cortex M3) SVC

    Не беда... вот пару раз побьют ногами, когда у клиента что-то не заработает и он насыпет ваших платок вам на голову, желание и появится. ;)
  5. Аналогичная проблема. Сходил на обед, вернулся и продолжил работать. И всё... IAR AVR debug выдал: USB driver initialization failed with error 0x20000009 Дебагер не работает. Начальство устроило истерику, тк проект в активной работе. Win 10 лицензионная, IDE: IAR AVR лицензия Никакие припарки и перестановка драйверов не помогли. Что посоветуете предпринять для решения проблемы?
  6. nRF52 BLE SDK (Cortex M3) SVC

    Только увидел сообщение. Вы батенька зря "волну не гоните"... В моем примере и не предусматривалось использование стека от Нордика, поэтому мне было не интересно, что их индусы написали в "рекомендациях". А не нужен их стек по причине ущербности, не работает он с многими моделями тлф в отличии от моего самопального. Добиться от них исправлений ошибок так и не удалось. Если бы Вам тема была интересна, мой мылоадрес в порте был указан.
  7. Снимаю шляпу... реально гениально. Ваша версия irq_forwarder не только быстрее но и работает. Проверил как с векторами в flash так и в ram - падения прекратились и все работает как в приложении так и буте. Спасибо... респект.
  8. Спасибо. К сожалению таймаут на месяц. Вернусь с отпуска, продолжу.
  9. Нет, все на месте, первым делом макрос проверяю. Вероятно все же дело в функции форварда векторов, вернее в нюансах ее сборки компилятором. Я в arm asm не силен, видимо придется вникать чтоб разобраться. Тк у гуру походу тоже идей нет.
  10. Уже этот вариант тестил. В ОЗУ выделил константу, которую приложение на старте инит величиной смещения своих векторов. Для бута значение одно, для приложения - совсем другое. Это делается при запрещенных прерываниях на самом старте. Примите во внимание момент. Если не дергать метод push(), то приложение не падает. Все прерывания четко отработывают, их 6.
  11. Проверял. Смещение текущего прерывания четко определяет без ошибок. Более того, bootloader полностью рабочий через форвардер, пишет, проверяет, запускает. Прерывания нормально используются, ничего не крэшится. Трудности начинаются в приложении. Оно под scmRTOS, поэтому и написал в эту ветку, тк причина была не совсем очевидна.
  12. Производитель еще тот крендель. Они ничего не рекомендуют кроме своих сборок. Обойти их безумный индуский код стороной - было лучшее решение в данном случае. Вероятно они поленились и в их 'авторско горяче-финской' модификации ядра никак не предусмотрен перенос векторов. Теперь каждый спасется как может...
  13. >> чем не угодил стандартный способ ремапа Не нашел функцию SYSCFG_MemoryRemapConfig.
  14. Цитата(Baser @ Mar 21 2018, 02:46) Немного не вяжется: у вас Cortex M0 или Cortex M0+ ? У Cortex M0 нет регистра VTOR, соответственно нельзя перенести таблицу векторов в середину флеш. Можно только в начало ОЗУ. Проект базируется на nRF51822, а это Cortex M0, VTOR нет. Но на мой взгляд, таблицу перенести можно. Для этого в стандартный (нулевой) адрес FLASH следует записать таблицу общую для bootloader и для application. Bootloader: *iar_startup.s file В этой таблице заменить все вектора на адрес функции обработчика прерывания. КодAddress from 0x0000             SECTION .main_intvec      __vector_table_main              DCD     sfe(CSTACK)              DCD     Reset_Handler              DCD     irq_forwarder              DCD     irq_forwarder              DCD     0; Reserved              DCD     0; Reserved              DCD     0; Reserved              DCD     0; Reserved              ....... Далее собственная таблица векторов bootloader. Она может располагаться где угодно в пространстве FLASH, задается в настройках линкера. Any FLASH address Код   SECTION .boot_intvec      __vector_table              DCD     sfe(CSTACK)              DCD     Reset_Handler              DCD     NMI_Handler              DCD     HardFault_Handler              DCD     0                        ; Reserved              DCD     0                        ; Reserved              DCD     0                        ; Reserved              DCD     0                        ; Reserved              DCD     0                        ; Reserved              DCD     0                        ; Reserved              DCD     0                        ; Reserved              DCD     SVC_Handler              DCD     0                        ; Reserved              DCD     0                        ; Reserved              DCD     PendSV_Handler              DCD     SysTick_Handler Далее за основной таблицей прерываний располагаем функцию форварда адресов: Linker file: place at address mem: 0xc8 {readonly section .irq_forwarder}; keep { section .irq_forwarder }; Code file: Переменная irq_table_offset может указывать смещение как во FLASH так и в RAM. Кодirq_table_offset @ 0x20000000 = (unsigned long) __section_begin(".boot_intvec");      typedef void (*irq_handler_t)(void);           __root void irq_forwarder(void)      {               //Read the number of the currently executing interrupt handler from IPSR.        //See the Cortex-M0 user guide for details.        uint32_t irq_interrupt_number = __get_IPSR();               //Find the address offset in the vector table        //for the currently running interrupt, irq_interrupt_number * 4        uint32_t vector_table_offset = irq_interrupt_number << 2;               //Get the address of the vector in the offset vector table        uint32_t offset_vector_address = vector_table_offset + irq_table_offset;        ///uint32_t offset_vector_address = vector_table_offset + (uint32_t)&irq_ram_table[0];             //Read the address of the IRQ handler to branch to from the offset vector        irq_handler_t irq_handler=(irq_handler_t)(*(uint32_t*)offset_vector_address);             //Branch to the irq_handler        irq_handler();      } При запуске bootloader инициализация: irq_table_offset = (unsigned long) __section_begin(".boot_intvec"); При запуске application from bootloader инициализация: Кодtypedef void (*application_main_t)(void);        apl_base_addr = find_application();   launch_application(apl_base_addr);      void launch_application(unsigned long base_addr)      {        unsigned long *pData;        unsigned long appl_cstack_pointer;        application_main_t appl_reset_handler;                   //Get application CSTACK value          pData = (unsigned long*)base_addr;        appl_cstack_pointer = *pData++; //+4 bytes             //Get Reset_Handler vector value from application intvec table        appl_reset_handler = *(application_main_t*)(pData);                         //Set mode flag        NRF_POWER->GPREGRET = DEV_APPLICATION_MODE;                   //Set application CStack pointer        __set_SP(appl_cstack_pointer);             //Jump to application Reset_Handler        appl_reset_handler();      } Траблы происходят из за использования форвардера Я не смог его обьявить как __task, компилятор воспротивился, чтоб запретить сохранять на стеке адрес возврата. Видимо проблема в этой точке кода. Помогите исправить и проверить идею Практически на 90% работает >> Меня очень смущает расположение основного стека близко к началу ОЗУ. Обычно его располагают в самом конце. Пока не могу преодолеть. Усилия перенести стек в конец RAM, яростно отвергаются линкером. Кодplace at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; place in ROM_region   { readonly }; place in RAM_region   { readwrite, block CSTACK, block HEAP }; //place at end of RAM_region {readwrite}; Строка place at end of RAM_region вызывает выдачу моря ошибок линковки.
  15. All pictures by one zip На мой взгляд целесообразно ввести в port раздельное заполнение тестовым паттерном. #define scmRTOS_STACK_PATTERN 0xAAAAAAAAUL #define scmRTOS_PROCESS_PATTERN 0xBBBBBBBBUL