Jump to content

    

artemkad

Свой
  • Content Count

    1545
  • Joined

  • Last visited

Community Reputation

0 Обычный

About artemkad

  • Rank
    Профессионал

Контакты

  • Сайт
    http://
  • ICQ
    224

Информация

  • Город
    Киев

Recent Profile Visitors

5099 profile views
  1. И смысл такому уподабливаться? Тут-же хрен знает какой результат получится. Поля-то от старых значений не чистятся.
  2. Ну, я бы не рекомендовал это для начинающих, но в IAR это вроде работает: sPPL0 a; a=(sPPL0){.CR.M=5,.CR.N=6}; Правда код там "оверкилл" - сперва затягивается вся структура целиком в регистры(служебную память), модифицируется нужное, а потом возвращается назад.
  3. Оптимизация констант.

    Забыть(ничего не делать) проще чем что-то сделать намеренно. Да и в реальности у меня, естественно, более вменяемые названия чем NAMEx.
  4. Оптимизация констант.

    В коде для компилятора 1ul<<bp_NAME1 и просто bp_NAME1 равнозначны т.е. не вызывают каких либо сообщений, а значит приходим к исходной проблеме "имя перенес, а добавить bm_ забыл" только теперь забыл добавить 1ul<< .
  5. Оптимизация констант.

    Ну, в конечном итоге я так и сделал. Собственно так и было изначально, но раздражало размещение рядом с ними перечисления с именами, в результате чего бесконтрольно проходили ошибки когда имя перенес, а добавить bm_ забыл. Использование сишного файла нужно было именно для скрытия исходных имен взятых из enum от остального кода. Конечный результат выглядит примерно так: State.h #define EVENT_EVENTS(name) bp_##name, enum { #include "events_list.h" }; #undef EVENT_EVENTS #define EVENT_EVENTS(name) static U32 const bm_##name = ((long)1<<bp_##name); #include "events_list.h" #undef EVENT_EVENTS Вспомогательный events_list.h #ifdef EVENT_EVENTS EVENT_EVENTS(NAME1) EVENT_EVENTS(NAME2) EVENT_EVENTS(NAME3) EVENT_EVENTS(NAME4) EVENT_EVENTS(NAME5) EVENT_EVENTS(NAME6) EVENT_EVENTS(NAME7) #endif Итого, State.h из файла с перечисленными именами битов создает два набора констант. Один набор с добавлением bp_ - номер позиции, второй в добавлением bm_ - собственно сама битовая маска. Ну и приятным бонусом оказался контроль за переполнением числа бит в маске.
  6. Оптимизация констант.

    Ну, мне сложнеепроще - у меня AVR...
  7. Оптимизация констант.

    Эти константы - битовые маски. Если они компилируются в код, то от них остается только операция с одним(нужным) битом. А если они остаются в памяти, то там помимо самой памяти еще и загрузка с проверками всего лонга.
  8. Оптимизация констант.

    Не подскажет ли кто как заставить IAR вместо выделения памяти (любой) на константы сразу использовать их значение в коде. При этот сами константы иннициализируются в отдельном Си-файле. U32 const bm_INPUT_DRIVER_TRUNK = ((long)1<<INPUT_DRIVER_TRUNK); И объявляются в хеадере: extern U32 const bm_INPUT_DRIVER_TRUNK; подключаемом к файлам в котором они используются: ЗЫ. Вытаскивать иннициализацию из Си-шного файла нельзя(значение которым иннициализируется константа берутся в этом файле и вытаскивать их оттуда наружу нельзя), замена на #define малоперспективна т.к. константы сами формируются автоматом из другого файла через #define, Multi file compilation использовать крайне не хочется потому как надо перебирать под него кучу кода в других в т.ч. не моих файлах. PPS. Что-бы было понятней, пожалуй приведу текущее содержимое: State.c #include "State.h" #define EVENT_EVENTS #define msg_EVENT(name) name, enum events_status { #include "events_list.h" }; #undef msg_EVENT #define msg_EVENT(name) U32 const bm_##name = ((long)1<<name); #include "events_list.h" #undef msg_EVENT #undef EVENT_EVENTS State.h #define EVENT_EVENTS /// #define msg_EVENT(name) extern U32 const bm_##name; #include "events_list.h" #undef msg_EVENT #undef EVENT_EVENTS /// Ну и впомогательный events_list.h #ifdef EVENT_EVENTS msg_EVENT(EVENT_1) msg_EVENT(EVENT_2) msg_EVENT(EVENT_3) msg_EVENT(EVENT_4) msg_EVENT(EVENT_5) #endif
  9. Да хоть на Гугл - страницу 404 он тебе всегда отправит.
  10. Типовая проблема. Только не в шумности, а в превышении минимального или максимального порога. Собственно в даташите прямо указана причина выключения: Причем в отличие от более старых модулей в Sim800 снизили верхний порог до 4.4В
  11. На сколько помню, в момент регистрации модуль начинает связь на максимальной мощности сигнала. Т.е. просадки можно оценить сразу и без специальных команд.
  12. В основном временем записи. Единственное вменяемое. Если массив хоть чем нибудь инициализирую в программе там появляются нули еще до попадания линкеру. Если без инициализации, там и так 0xFF.
  13. Тогда тем более не нужен. Проблема возникает когда утечка от помехи через порт на питание превышает ток потребления схемы от этого питания.
  14. Транзистор не нужен. Иначе утечка стабилитрона умноженная на коэффициент усиления транзистора на потреблении поставит крест.
  15. Ставишь резистор в делителе не 12 кОм, а 200кОм и ограничительный стабилитрон на питание МК если уж совсем хочется защититься Никаких проблем с однонаправленными - в другую сторону они ограничивают напряжение на уровне 0,7В что гораздо лучше чем -3...6В которые дают двунаправленные стабилитроны.