Да, размер кода модуля скомпилированного из С файла bcd.c Есть ещё сегменты с глобальными данными, разделяются как правило на инициализированные - .data и неинициализированные .bss. Первые заполняются при старте МК и тоже входят в размер файла прошивки. Вторые, как правило, зануляются.
_________________ Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR!
Смотря какой подход в программировании. После заявления упомянутого сотрудника, прилагательное "гениальный" читается несколько язвительно.
изначально та и было - подуть на него боялись. Все дураки, один он гений. Когда я пришел - было три проекта. Я специально туда не лез, занимался своими задачами. Ну и полгода наблюдал как тонет этот титаник и руководство прозревает. Потом перепилил один проект, второй, третий на паузе - ждет новую комплектуху. Да, там половина косяков не его была. Но чрезмерное ЧСВ и медленность работы привело к тому, что другая команда отказалась с ним работать. В итоге попрощались за год до пенсии.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
лично меня выбешивает, если кто-то бравирует "знанием" a+++b и тому подобных "кружев", которые допускает Си. абсолютно бессмысленные знания, примерно как умение шевелить ушами. даже, наверное, вредные знания, если задуматься о том, что код не для одного человека написан.
сам никогда не пишу непонятно, и другим не советую.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Кто бы еще толково описал подобное построение программ с помощью таймеров. А то я тут читал у Ди-Халта про это, но там одно по одному и путано, в итоге он как-то сразу переходит на диспетчер задач и РТОС. Надо бы, чтобы понятно было расписано, как использовать таймер, какие промежутки считать, как использовать и на пальцах. ))))))
А что там подробно описывать? Берем задачу, разбиваем ее на этапы и выполняем каждый этап за проход. Вот, скажем, мне как-то нужно было читать тачскрин. Порядок действий представлял себе слегка туманно. В качестве примера нашел такой вот код:
Код:
void TouchScan (void) {
push = 0; DDRA = 0b10100000; // X_minus, X_plus на выход, сажаем Х пленку на землю PORTA = 0b01011111; // остальные выводы как входы с подтяжкой delay_ms(1);
if (read_adc(6) < 100) { // если есть нажатие ( проверяем на 0 вывод Y- ) push = 1; press_count++; if (press_count > 1) { press = 1; } PORTA = 0b01111111; // cчитываем X координату, X_minus на землю, X_plus на +5 вольт delay_ms(1); x = abs((int) (232 - 0.276*read_adc(4)));
// записываем значения АЦП по 2-м точкам // сопоставляем координаты // и через уравнение прямой по 2-м точкам находим промежуточные значения нажатия // x = 232 - 0.276*ADC // y = 0.25*ADC - 67.5
DDRA = 0b01011111; // cчитываем Y координату, Y_minus, Y_plus на выход PORTA = 0b10111111; // Y_minus на землю, Y_plus на +5 вольт delay_ms(1); y = abs((int) (0.25*read_adc(5)-67.5)); } else { press = 0; press_count = 0; } }
После опытов в железе стало очевидно, что в быстрой многозадачной программе с отзывчивым интерфейсом подобное использовать нельзя, код был переписан и принял такой вид:
Код:
void touchRead(void) { // This func is to be fired each ~1ms // if TFT shared pins used for polling, // any usual display operations are to be disabled till 'busy' flag clears
И вот теперь у нас простенький цветной ардуиновский экранчик уже успевает и опрашивать тач, и передавать дату по тем же пинам без ощутимой для юзера задержки.
А Вы знаете - я использую такой же подход со свичем и кейсами. Есть правда подобные конструкции для инициализации чего-то, которые нужны один раз на старте программы, а необходимость хранить в статике некие переменные означает что они будут висеть мертвыми после инициализации. В общем я пошел дальше - инициализации и прочие разовые процессы разбил на отдельные структуры, создаю их когда надо динамически, потом удаляю. Не скажу что это нужно для реализации задачи - для саморазвития и только.
Есть правда подобные конструкции для инициализации чего-то, которые нужны один раз на старте программы, а необходимость хранить в статике некие переменные означает что они будут висеть мертвыми после инициализации. В общем я пошел дальше - инициализации и прочие разовые процессы разбил на отдельные структуры, создаю их когда надо динамически, потом удаляю. Не скажу что это нужно для реализации задачи - для саморазвития и только.
Инициализация, имо, один из тех немногих случаев, когда использование задержек оправдано. С другой стороны, умение находить для задачи несколько решений == огромный плюс к скиллу.
Есть правда подобные конструкции для инициализации чего-то, которые нужны один раз на старте программы, а необходимость хранить в статике некие переменные означает что они будут висеть мертвыми после инициализации.
Есть правда подобные конструкции для инициализации чего-то, которые нужны один раз на старте программы, а необходимость хранить в статике некие переменные означает что они будут висеть мертвыми после инициализации.
В контексте темы слово "статика" как минимум двусмысленно - если речь о глобальных переменных выделяемых на этапе компиляции - то "одноразовым" скорее место в использующих их функциях - на стеке. Впрочем, если это одна из "корневых" функций - то трюк не сработает.
В общем я пошел дальше - инициализации и прочие разовые процессы разбил на отдельные структуры, создаю их когда надо динамически, потом удаляю.
Писание "под эмбед" зачастую завязано на malloc-оненавистничество. Канонически стек и куча борются за одну и ту-же ресурсную нишу - так что [теоретически] избавление от кучи в пользу стека снижает накладные расходы и избавляет от слабопрогнозируемых прелестей фрагментации в перспективе вечной жизни поделки. Но на месте, конечно-же, виднее.
А вы не лузьте в высшую математику. Вы сказали, что есть переменные, которые висят мертвым грузом. И я вам привел пример с куском кода, который работает только при инициализации. Если его написать как обычно, останутся переменные, которые потом нигде не используются. Поэтому вспоминаем про правило время жизни переменной. И я сделал функцию-карусельку с обычными переменными. Не static или extern.
И я вам привел пример с куском кода, который работает только при инициализации. Если его написать как обычно, останутся переменные, которые потом нигде не используются.
Что значит "как обычно"? В приведённом коде я ничего необычного не вижу. Простая функция инициализации вне основного цикла - так, наверное, все делают. Коль скоро эта функция начинается и завершается, никаких лишних переменных нигде не останется.
Хотя, если Вы имели в виду, что многие любят переменные вне функций - в смысле, глобальные для модуля - то это другое дело, это уже плохой стиль программирования.
если Вы имели в виду, что многие любят переменные вне функций - в смысле, глобальные для модуля - то это другое дело, это уже плохой стиль программирования.
а как иначе в Си? без глобальных функций для модуля очень тяжко, если вообще возможно... это глобальные для проекта переменные можно исключить при известном уровне мазохизма...
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Писание "под эмбед" зачастую завязано на malloc-оненавистничество.
Вот это вряд ли. Тут скорее очень поверхностное знание языка, когда "погромист" банально не знает, чем struct, к примеру, отличается от union и лепит батареи вложенных циклов там, где достаточно простой рекурсии. Соответственно, про free() он тоже никогда не слышал. И использование задержек в теле основного цикла из той же серии, кстати.
Вы конечно-же правы. Термин о malloc-оненавистничестве был скорее иронией на привычный факт, что вопрос на тематических форумах по получению памяти из кучи вызовет как минимум настороженный встречный вопрос о понимании сильных и слабых сторон используемого инструмента, а то и совет "использовать что попроще".
_________________ Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR!
А вы не думали что оно не от хорошей жизни происходит? Когда функции malloc и free отожрут лишних пару килобайт весьма ценного флеша? Да и проблемы фрагментации памяти тоже иногда доставляют проблем, но тут правда особенности реализации, не всегда вопрос возникает.
А вы не думали что оно не от хорошей жизни происходит? Когда функции malloc и free отожрут лишних пару килобайт весьма ценного флеша?
Ну, тут уж вам придется сделать свой нелегкий выбор и решить, что для вас важнее: либо переменные, вечно сидящие во флеше из-за какой-то одной вторичной функции, или же динамическая работа с памятью, где объем используется в разы эффективнее и позволяет сделать на паре кБ то, что многие привыкли делать на 32-64 кБ.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 32
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения