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

Johnny81

Свой
  • Постов

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

  • Посещение

Весь контент Johnny81


  1. Изначально вакансия была без удаленки. Теперь пункт про автобус не актуален :)
  2. спасибо, поправил По графику - ему первое время придется соответствовать, чтобы часов 6 нашего рабочего времени пересекались
  3. Upd Можно сразу писать мне на [email protected] или в телеграм @EvgeniyN Нам нужен человек в штат, работающий надо текущими задачами 40 часов в неделю за оклад. Предприятие довольно большое, есть схемотехники, конструктора, платчики, программисты, тестировщики. Соответственно вакансия - программиста. Желательно немного понимать в электронике и уметь в осциллограф, но особо глубоких познаний не требуется - к примеру у меня их нет, если возникает вопрос - я спрашиваю схемотехника. Проектов много разных. Какие-то активны, какие-то старые и практически "замороженные". Иногда старый проект "размораживается" :). Новые проекты на stm32 (f1, f2, f3, f4), старые - atmega (128/1280/2560, есть и более мелкие). Из одного проекта может собираться много прошивок для разных изделий и с разным функционалом. Изделия взаимодействуют друг с другом и с ПО на компьютере (нашим и чужим), с чужими устройствами, т.е. есть некоторая экосистема - набор протоколов (наших и чужих), систем управления, ПО настройки, практик и т.п. Основные интерфейсы - 485/232, I2C, CAN, SPI, Ethernet/GPRS Программистов на железе несколько, проекты пересекаются - есть много общего кода, в т.ч. общего для avr/stm/windows
  4. Описание вакансии https://krasnodar.superjob.ru/vakansii/veduschij-inzhener-programmist-33600194.html?utm_campaign=google_jobs_apply&utm_source=google_jobs_apply&utm_medium=organic Можно удалённо. Вопросы можно задавать мне
  5. я вам намекаю, что фриртос тут дело десятое. Вам надо придумать алгоритм работы, пройтись по нему в поисках гонок/дедлоков, а дальше уже переложить его на фриртос. Или не перекладывать - фриртос не отменяет высокоприоритетных прерываний какой-то готовой межпроцессорной синхронизации во фриртос, имхо, из коробки нет
  6. А при чем тут фриртос вообще? Вам надо каким-то образом определить свободность интерфейса...
  7. А вы уверены, что тут вообще нужна очередь? Есть общие данные - содержимое дисплея. С ними работают из разных потоков через локи. Отдельный поток занимается передачей этих данных в дисплей.
  8. А почему нет отладки? Загрузчик модифицируете так, чтобы не ставилась защита. Заливаете загрузчик из под отладчика. Далее заливаете программу штатно через загрузчик. Попадается в Jump_To_Application (). Переключаетесь на отладочные символы программы и вперед! Как сделать последнее в IAR - не знаю :)
  9. Думаю стоит поглядеть в сторону статической библиотеки. Сначала собираете секретную часть исходников в такую библиотеку, а далее используете ее вместе с открытыми исходниками. Лично не пробовал
  10. Странный HARDFAULT

    А я отвечал выше, слилось в одно сообщение. void xPortSysTickHandler( void ) { /* If using preemption, also force a context switch. */ #if configUSE_PREEMPTION == 1 portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; #endif /* Only reset the systick load register if configUSE_TICKLESS_IDLE is set to 1. If it is set to 0 tickless idle is not being used. If it is set to a value other than 0 or 1 then a timer other than the SysTick is being used to generate the tick interrupt. */ #if configUSE_TICKLESS_IDLE == 1 portNVIC_SYSTICK_LOAD_REG = ulTimerReloadValueForOneTick; #endif ( void ) portSET_INTERRUPT_MASK_FROM_ISR(); { vTaskIncrementTick(); } portCLEAR_INTERRUPT_MASK_FROM_ISR( 0 ); } portSET_INTERRUPT_MASK_FROM_ISR раскрывается в ulPortSetInterruptMask __attribute__(( naked )) unsigned long ulPortSetInterruptMask( void ) { __asm volatile \ ( \ " mrs r0, basepri \n" \ " mov r1, %0 \n" \ " msr basepri, r1 \n" \ " bx lr \n" \ :: "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) : "r0", "r1" \ ); /* This return will not be reached but is necessary to prevent compiler warnings. */ return 0; } portCLEAR_INTERRUPT_MASK_FROM_ISR раскрывается в vPortClearInterruptMask __attribute__(( naked )) void vPortClearInterruptMask( unsigned long ulNewMaskValue ) { __asm volatile \ ( \ " msr basepri, r0 \n" \ " bx lr \n" \ :::"r0" \ ); /* Just to avoid compiler warnings. */ ( void ) ulNewMaskValue; }
  11. Странный HARDFAULT

    А где есть более подробная инфа? В STM32F3xxx and STM32F4xxx Cortex-M4 programming manual вообще ничего не написано, а этот список я взял из The defnitive guide to the ARM Cortex-M3 Насчет питания и остального - поглядим, спасибо. Я со схемотехникой не особо дружу, этим отдельный народ занимается. Пока они заняты, пытаюсь исключить чисто программные косяки
  12. Странный HARDFAULT

    спасибо, пробегусь по стекам процессов
  13. Странный HARDFAULT

    А сам UNDEFINSTR ничего полезного не несет? В книжке написано 1. Use of instructions not supported in Cortex-M3. 2. Bad/corrupted memory contents. 3. Loading of ARM object code during link stage. Checks compile steps. 4. Instruction align problem. For example, if GNU Tool chain is used, omitting of .align after .ascii might cause next instruction to be unaligned (start in odd memory address instead of halfword addresses). С учетом того, что этот код обычно работает нормально, остается причина 2. Т.е. проц неверно читает FLASH?
  14. Странный HARDFAULT

    Стеки каждого процесса с большим запасом. Контроль стека во фриртос включен, не стреляет. Ну и при исчерпании стека был бы расстрел чего-нить или MemoryFault, а у меня походу UsageFault - 7.4.0, старенькая, пока проблем не было - да - сон не испльзуется - контроль стека включен, уровень 1. Стеки с двукратным запасом примерно - выровнены, вроде как норм - включен, используется __attribute__(( naked )) unsigned long ulPortSetInterruptMask( void ) { __asm volatile \ ( \ " mrs r0, basepri \n" \ " mov r1, %0 \n" \ " msr basepri, r1 \n" \ " bx lr \n" \ :: "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) : "r0", "r1" \ ); /* This return will not be reached but is necessary to prevent compiler warnings. */ return 0; } __attribute__(( naked )) void vPortClearInterruptMask( unsigned long ulNewMaskValue ) { __asm volatile \ ( \ " msr basepri, r0 \n" \ " bx lr \n" \ :::"r0" \ ); /* Just to avoid compiler warnings. */ ( void ) ulNewMaskValue; } Генератор 25МГц, рабочая частота 168 МГц, питание 3,3. FLASH_ACR latency стоит 5, глянул даташит - вроде как норм
  15. Странный HARDFAULT

    STM32F427, gcc Есть устройство, которое раз в несколько часов падает в hard fault. В разных местах - в обычном коде, в прерываниях. Удалось повторить под отладчиком - упало в SysTick_IRQHandler (стандартный от freertos) Мой обработчик HardFault выдает CFSR=0x00010000, // UNDEFINSTR HFSR=0x40000000, // FORCED DFSR=0x00000001, AFSR=0x00000000 PC=0x080D6626; LR=0xFFFFFFFD; PSR=0x6100000F; r0=0x00000000; r1=0xA5A5A5A5; r2=0x10000000; r3=0xE000ED04; r12=0xA5A5A5A5; AFSR=0x00000000 Надо понимать, что это прерывание исполняется постоянно и все ок. Но иногда стреляет HardFault При этом та же самая прошивка на чуть другой плате (ряд компонентов отсутствует, плюс сделана в другое время - возможно другие партии комплектующих) работает штатно. Повторяется на нескольких экземплярах. Что это может быть такое? Куда копать? Может какая-то аппаратная проблема?
  16. Так а пробел есть после "\"? Если есть - уберите
  17. это конечно вкусовщина, но я бы расставил для всего кроме арифметических операторов. Наверное у меня такого кода очень мало и мне лень учить приоритеты, а также задумываться - разные ли они в си, питоне, яваскрипте и т.п.
  18. Вот ни разу не очевидное выражение :maniac: Плюс что-то кажется мне, что тут правильней не бинарное или, а логическое. А по теме - врядли в IAR и gcc разный приоритет операторов, если проект у вас был рабочий - оставьте как есть, просто отключите эти ворнинги. Если хотите улучшить читаемость - лучше ее отдельно улучшать, после того как перенесенный проект заработает в таком виде
  19. Ну так может bootloader ее сам устанавливает? Попробуйте сделать unsecure из segger jflash или ее аналога
  20. В такой постановке вопроса - ИМХО, только через внешний отладчик. Который отловит hard fault и снимет дамп всего проца. Если осетра урезать - то возможны и другие варианты
  21. Как вариант - заведите свой собственный флаг dmaBusy. В прерывании по концу DMA RX его снимайте, при начале работы с SPI - ставьте
  22. Поддерживает, см netif_add
  23. А как он это сделает, если функция получает неконстантный буфер, т.е. может его модицифировать. В этом случае копирование во временный буфер не может быть соптимизировано...
  24. ну вообще говоря при чем тут стек? char *buffer="0"; // это указатель на константу в памяти. Си дает так сделать? Может и дает, но менять ее нельзя. Для avr это по факту будет 2 байта в ОЗУ itoa (RxBuf[3],buffer,10); // вы меняете константу :maniac: Более того, если RxBuf[3] скажем 123, то вы меняете 4 байта (1,2,3,\0), т.е. расстреливаете 2 байта ОЗУ после этой константы Лучше как-то так char buffer[4]; itoa (RxBuf[3],buffer,10);
  25. А вот это странно и тут я бы разобрался. Конечно может быть косяк компилятора, но более вероятно что вы где-то заходите в зону UB (неопределенного поведения). Скажем обращение по нулевому указателю запрещено void f(char *addr) { if (addr) // этот if на высокой оптимизации будет выкинут, так как doSomething(); *addr = '1'; // эта строка говорит компилятору, что addr точно не 0 }
×
×
  • Создать...