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

Язык СИ для микроконтроллеров


Рекомендуемые сообщения

Только что, Alex сказал:

Только что обновил своё сообщение.   :)

Мне столько информации сразу не переварить :(

Опыт - это то, что получаешь, не получив того, что хотел

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Вот весь Ваш код работы с еепром :

eeprom_write_byte(&data_0, Value_ee = ~eeprom_read_byte(&data_0));
setbit (PORTB, SIG);
_delay_ms(Value_ee ? 16 : 125);
clrbit (PORTB, SIG);

Можно и от переменной избавиться, но тогда придётся дважды читать значение еепром.

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

6 минут назад, ARV сказал:

к чему бы это?

Мне понятно как работает Ассемблер на МК. Так же немного понятен СИ в отрыве от МК . Но вот связать СИ с МК пока не могу.  Такие моменты немного в этом помогают.

10 минут назад, ARV сказал:

осуществляет переход на этот адрес...

Хорошо , переход происходит. Но это наверно лишь расположит начало тела функции  по адресу 0Х0000 .  Но ведь функция закончит свою работу  и как по return()   исполнение продолжится там , где  funcptr(); была вызвана.

 

 

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Только что, SDD39 сказал:

Но это наверно лишь расположит начало тела функции  по адресу 0Х0000

Нет, тем кодом вы не располагаете функцию по заданному адресу, а говорите компилятору, что функция УЖЕ на том адресе. Поэтому компилятор при "вызове" этой функции просто сделает call 0x0000, а там УЖЕ есть код, выполняемый при сбросе... Этот код переставит стек, очистит память, и никаких следов от того, что был не jmp, а call не останется...

Изменено пользователем ARV

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

17 минут назад, ARV сказал:

Ну да, только я не уверен, что value_ee, от которой вы избавились, далее по ходу пьесы никому не нужна...

Кстати, даже если бы она и нужна была, то никак не логично делать это всё через if-else, с двумя одинаковыми кусками кода. Согласитесь ?
Прочитали -> модифицировали (в данном случае - проинвертировали) -> сохранили.

Ссылка на комментарий
Поделиться на другие сайты

Только что, Alex сказал:

Согласитесь ?

Ну так я ж ни слова не говорю :) а молчание - знак согласия.

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

5 минут назад, ARV сказал:

и никаких следов от того, что был не jmp, а call не останется...

А не до вызова ли main происходит инициализация стека и всяких глобальных переменных ? :huh:

Блин, я туплю уже.... 0-вой адрес - это же не main :D

Ссылка на комментарий
Поделиться на другие сайты

Только что, Alex сказал:

А не до вызова ли main происходит инициализация стека и всяких глобальных переменных ?

До него, до родимого...

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, ARV сказал:

Спорим? ;)

чО спорить тА: Не вижу запрета прерываний, НО ЛУП ЕСТЬ, это из Atmel Studio startup-file (ПРАВДА НЕ авр):

/**
 * \brief This is the code that gets called on processor reset.
 * To initialize the device, and call the main() routine.
 */
void Reset_Handler(void)
{
    uint32_t *pSrc, *pDest;

    /* Initialize the relocate segment */
    pSrc = &_etext;
    pDest = &_srelocate;
...

...

...

    LowLevelInit();
    /* Initialize the C library */
    __libc_init_array();

    /* Branch to main function */
    main();

//--->>> ВЫШЛИ ИЗ МЭЙН!!!

    /* Infinite loop */
    while (1);
}

Можно сделать все! Но чем больше можно, тем больше нельзя!

Ссылка на комментарий
Поделиться на другие сайты

34 минуты назад, Alex сказал:

Вот весь Ваш код работы с еепром :

 

Что то я не так наверное сделал, но память программы с этим куском   переполнена в   в 3.5 раза   :(

Опыт - это то, что получаешь, не получив того, что хотел

Ссылка на комментарий
Поделиться на другие сайты

Что-то никак вникнуть не могу в функции работы с еепромом. Почему в аргументах принимаются какие-то указатели ? По логике, должен передаваться адрес ячейки.
Можно на них глянуть ? :huh:

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, Alex сказал:

Что внимательнее читать ? :blink:
Я цитировал вопрос :

И имел в виду, что неважно через чего вызывать - через указатель, или напрямую.

Что то Вас тут воЩе куда-то заблудили: какой мэйн вызывать, для чего, что за глупость!

Там в начальном посте, откуда все пошло(на этом форуме тяжело конечно искать, тредов нет) я писал про вызов функции из мэйна, из цикла в этом мэйне по указателю!

- все переврали - получилась рекурсия, как страшно жить :) !

Можно сделать все! Но чем больше можно, тем больше нельзя!

Ссылка на комментарий
Поделиться на другие сайты

По-моему, это Вы куда-то заблудились. Читаем внимательнее :

2 часа назад, ARV сказал:
2 часа назад, SDD39 сказал:

А разве нельзя просто вызвать функцию main() как и любую другую?

Можно. А что при этом будет со стеком?

Далее :

2 часа назад, SDD39 сказал:
2 часа назад, ARV сказал:

А что при этом будет со стеком?

Тот же вопрос .. а если вызвать main() через указатель? Разве не получим то же самое , забыл как называется когда функция саму себя вызывает?

На что я ответил :

2 часа назад, Alex сказал:

Получим. Называется - рекурсия.


Что не так ? Где Вы враньё нашли ?
Не путайте ответы на вопросы других участников, со своими мыслями, о которых никто тут не знает.

Ссылка на комментарий
Поделиться на другие сайты

39 минут назад, Alex сказал:

...
Что не так ? Где Вы враньё нашли ?
Не путайте ответы на вопросы других участников, со своими мыслями, о которых никто тут не знает.

Да! Не вранье :) !

Вызывать main() это хуже вранья, это бред и рекурсия в то же время :) !

Но все равно Вы не всю ветку привели, она раньше началась, - про вызывать через указатель это же, тоже ответ на то что Вы не привели!

Но не мудрено при таких заворотах :) !

Изменено пользователем ruhi

Можно сделать все! Но чем больше можно, тем больше нельзя!

Ссылка на комментарий
Поделиться на другие сайты

18 минут назад, ruhi сказал:

Но все равно Вы не всю ветку привели, она раньше началась

Да помню я с чего всё началось. Было предложение перейти на 0-вой адрес через указатель на функцию.
Потом SDD39 спросил - нельзя ли просто вызвать main(); ? Потом про вызов через указатель на main. И т.д....

Ссылка на комментарий
Поделиться на другие сайты

4 минуты назад, Alex сказал:

Да помню я с чего всё началось. Было предложение перейти на 0-вой адрес через указатель на функцию.
Потом SDD39 спросил - нельзя ли просто вызвать main(); ? Потом про вызов через указатель на main. И т.д....

Да дело не в "помню", а в том что не найти начала если позже зашел!

В самом начале было вот так:

typedef uint32_t (*ptrFunc)(void);//можно определить параметры, но они у всех операций должны быть одинаковыми

ptrFunc actionFunc;

uint32_t operation1(void)

{ ваш код операции со вставками переходов в виде: actionFunc = operationХХХ;}//где operationХХХ - функция которая должна быть вызвана следующей.

uint32_t operation2(void)

{ ваш код операции со вставками переходов в виде: actionFunc = operationХХХ;}//где operationХХХ - функция которая должна быть вызвана следующей.

...

main()

{

actionFunc = operation1;

while(1)

{

//можно оставить:

do_every_time(); // функция, которая делает то, что делается всегда и в любом случае, например, обновляет дисплей

actionFunc();

}

 

}

Можно сделать все! Но чем больше можно, тем больше нельзя!

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, Alex сказал:

Что-то никак вникнуть не могу в функции работы с еепромом. 
Можно на них глянуть ? :huh:

Я информацию брал отсюда http://samou4ka.net/page/chtenie-i-zapis-eeprom-v-winavr

Опыт - это то, что получаешь, не получив того, что хотел

Ссылка на комментарий
Поделиться на другие сайты

2 часа назад, Alex сказал:

Что-то никак вникнуть не могу в функции работы с еепромом. Почему в аргументах принимаются какие-то указатели ? По логике, должен передаваться адрес ячейки.
Можно на них глянуть ?

Обычные функции из комплекта avr-libc В рамках парадигмы языка Си адрес и есть указатель :)

1 час назад, ruhi сказал:

В самом начале было вот так

Я вам на это не один раз отвечал, у вас не включены уведомления о цитатах? Я всегда вижу, когда кто-то меня процитировал и сразу читаю это сообщение - нить беседы не теряется.

Изменено пользователем ARV

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

8 часов назад, ARV сказал:

Правильно (и качественно) работать всегда сложнее, чем как-нибудь, и не только в программировании.

Так нужен-то не "правильный" а "эффективный" код. Это когда программист знает компилятор и документирует, что нарушение стандарта в таких-то местах приводит к повышению производительности аж на 2%.

На счет прерываний - вроде как в Си есть стандартные сигналы,. В полноценных ОС они используются для отлова сигналов системы вроде SIGTERM. Принцип тот же что у аппаратных прерываний.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

8 часов назад, COKPOWEHEU сказал:

Так нужен-то не "правильный" а "эффективный" код.

Давайте рискнем отделить мух от котлет...

1. Самый эффективный код получается на ассемблере.
2. Ассемблерный код сложно поддерживать и он практически не переносим
3. Для переносимости и поддержки применяют Си
4. Но Си может дать трудноотслеживаемые побочные эффекты, если не придерживаться строго стандарта
5. Си, кроме прочего, даёт менее эффективный код, чем ассемблер

Итак, вышеприведенное - верно? Если верно, то круг замкнулся - как жить дальше?! Ассемблерным кодом можно задушиться, от Сишного можно огрести бед... Ужос.

А ларчик открывается просто, в соответствии с древнеримской поговоркой: кесарю - кесарево. Высокоэффективные участки кода следует реализовывать в виде модулей на ассемблере, весь остальной код, не требующий высокой эффективности, на Си... Абсолютно стандартный подход, дающий по совокупности всех критериев предельно лучший результат. Только не при помощи ассемблерных вставок и "грязных хаков" (вроде выяснения положения указателя стека в локальной функции и по нему вычисления адреса возврата для каких-то целей), а при помощи полноценных ассемблерных модулей, чтобы с точки зрения Си это просто была "внешняя функция".

Как-то так. И стандарты соблюдаются, и эффективность не страдает.

Изменено пользователем ARV

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

4 часа назад, ARV сказал:


5. Си, кроме прочего, даёт менее эффективный код, чем ассемблер

 

К тому же и это утверждение уместно только гипотетически!

Сейчас можно уверенно утверждать, что оптимизирующие компиляторы генерируют код с эффективностью близкой к оптимальной , и в ручную их не обыграть в этом, так же как и соответствующие программы в шахматы, например! (как обычно, можно, конечно, найти исключения, которые все равно будут подтверждать правило!)

Так что писать, действительно, надо С-ях, или даже на С++, и к ассемблеру надо обращаться только для использования специальных аппаратных возможностей аппаратной платформы.

А если кто то не может или не хочет понимать логику работы компилятора или думает что он умнее чем поколения людей создававших/отрабатывавших концепцию и технологию компиляции-линковки, и он-то знает что все это не правильно...

Такому человеку и программированием-то, лучше наверно, не заниматься.

Можно сделать все! Но чем больше можно, тем больше нельзя!

Ссылка на комментарий
Поделиться на другие сайты

9 часов назад, ARV сказал:

4. Но Си может дать трудноотслеживаемые побочные эффекты, если не придерживаться строго стандарта

Много раз натыкался на статьи с примерами неопределенного поведения в казалось бы простейшем коде. Если пытаться отловить _вообще_все_ то такой код будет еще менее читабельным чем ассемблерный. Да Си для этого и не предназначен. Все эти фокусы нужны чтобы собирать оптимальный код под любую платформу, используя ее особенности. Поэтому якобы неопределенное поведение (char<<7) вполне можно использовать - если точно известен диапазон платформ.

4 часа назад, ruhi сказал:

К тому же и это утверждение уместно только гипотетически!

Мы сейчас на контроллерном форуме, и вот тут это утверждение правильно. В Си похуже с битовой магией чем в ассемблере. К примеру, для нахождения среднего арифметического двух 8-битных чисел, на асме можно их просто сложить, а потом сдвинуть вправо - и все, бит переноса будет учтен автоматически. В Си же для этого придется приводить оба числа к 16-битным со всеми вытекающими последствиями. Это только самый простой пример.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...