Jump to content

    

jcxz

Свой
  • Content Count

    9432
  • Joined

  • Last visited

Community Reputation

0 Обычный

3 Followers

About jcxz

  • Rank
    Гуру
  • Birthday 12/01/1974

Контакты

  • ICQ
    Array

Информация

  • Город
    Array

Recent Profile Visitors

17319 profile views
  1. Вместо того чтобы такой дохлый МК (STM32F103) покупать за такую конскую цену, лучше уж XMC4500 за ~13 евро: возможностей (память, периферия, FPU, частота) - чуть ли не на порядок больше, и при этом цена - ниже. Если уж ещё дешевле - EFM32.
  2. А если через год его самого (NXP) кто-то купит и решит, что не нужно ещё 9 лет выпускать это чип? И NXP то уже нет - и спросить не с кого за невыполненные обещания.
  3. Значит - поставить в окне дизассемблера. Я бы не рассчитывал на этот __BKPT - неизвестно как его отладчик обрабатывает. Где-то что-то у вас затирается/разрушается. Так оно и будет бегать при внесении любых модификаций в код. Ну да - и перестанет проявляться. Возможно. А когда включит - опять будет проявляться. Это пинание колёс, а надо искать баг.
  4. Как все делают - в начале программы заполнить удобным паттерном (константой), а в подозрительном месте - проверить уровень использования. И где он у вас "срабатывает"? Куда бряк поставили?? На "if" что-ль? Вы сами понимаете что делаете? Складывается ощущение - совершенно не понимаете. Бряк нужно ставить на __ISB(). А это что за мусор и зачем сюда запихали?:
  5. Откройте глаза шире: У нормальных производителей (INFINEON) размер символа UART = 1...63 бита. Так-то! А не какие-то плешивые 4.
  6. IAR. У других думаю есть аналогичные. По-крайней мере у CCS - точно есть.
  7. Непонятно - как memcpy(output + 1, input, output_length); выполняется без HF, хотя должно вылететь уже на нём. Поэтому я бы например проверил стеки на предмет переполнения. В этой точке (после memcpy()). Также - ISR-ы на предмет неразрушения регистров не участвующих в стекинге (был тут недавно один деятель, который не сохранял R8,R9 в ассемблерном ISR и аргументируя "и так ведь работает" ). Ну и другие подобные места проверить.
  8. Так я же уже написал ранее: PS: А ещё совет - написать автоматический расшифровщик причины HF. В ISR HF. Чтобы каждый раз врукопашную по регистрам не лазить.
  9. Очевидно - открыть мануал на ядро и расшифровать причину fault-а по приведённым регистрам (тем более, что нужные регистры Вы уже привели). Судя по SCB->HFSR, SCB->CFSR, SCB->BFAR у Вас точная ошибка при обращении к данным по адресу 0x20083399, произошедшая при PC==0xA0B0 (если конечно правильно снят дамп стекинга). В этой точке видимо R7+R3=0x20083399 (R3 вы привели, а R7 - нет). Лень листать даташит на ваш МК, вангую выход на пределы физической памяти. Почему обращение произошло по этому адресу - ищите. PS: Всё-таки открыл даташит: так и есть - выход за пределы RAM2 (>= 0x20080000). PPS: Советую в проблемной точке поставить условный бряк на условие R7+R3 >= 0x20080000 и исследовать отладчиком.
  10. "Наворачивать исходник printf()" - нет необходимости. Если хочется получить максимально гибкий printf(), для этого есть его вариант с передачей ему в аргументах 2-х указателей: указателя на свою callback-функцию и указателя блок параметров для неё. extern "C" int _Printf(void *(*)(void *, int), void *, const char *, va_list *);
  11. А как определили что "не фейковые"?
  12. Наверное не на все, а на те, которые имеют контроллер на AVR. Мне должен прийти вроде с платой на STM32 (хотя полной уверенности нет). Или думаете - и в тех контроллерах 3D-принтеров, которые на ARM, там тоже абдуриновый код внутрях? Это было бы печально...
  13. Не нужны все эти ухищрения. Тупой простейший цикл по N первым 32-битным словам - и всех делов. Примерно так сделано у меня в аналогичном случае: enum {JK_cfg, JK_now, JK_control, JK_file, ... JK_n}; #define apiKeyLen 12 //[байт] #define apiKeysN ((sizeof(apiKeys) - 1) / apiKeyLen) #define __align4 __attribute__ ((aligned (4))) typedef __packed u32 u32p8; typedef __packed u64 u64p8; char const apiKeys[] __align4 = "cfg " //JK_cfg "now " //JK_now "control " //JK_control "file " //JK_file ... }; int F(char const *str) { char const *ss = &apiKeys[sizeof(apiKeys) - 1]; u64 q = ((u64p8 *)str)[0]; u32 j = ((u32p8 *)s)[2]; int n = apiKeysN - 1; do { ss -= apiKeyLen; if (q == ((u64p32 *)ss)[0]) if (j == ((u32 *)ss)[2]) break; } while (--n >= 0); return n; } Компилируется это в короткий оптимальный цикл. Если длина некоторых имён превышает apiKeyLen (хвост вылазит за apiKeyLen), то после выхода из цикла добавляем проверку хвоста и, если он не совпадает, возвращаемся в цикл. Ну или - в отдельный короткий список такие имена. PS: Использование strstr() для такой цели - это конечно автор старался как можно сильнее затормозить работу. Только этим можно объяснить её использование.
  14. Так в чём проблема? Создаёте ИП и продаёте своей неразворотливой конторе. Не в убыток себе, конечно. Ваше руководство предоставило вам такую прекрасную возможность подзаработать!