Pull to refresh

Comments 32

Спасибо за статью. Вспоминается шуточный код по теме:
cli
hlt

Прикольная штука, раньше фанател просто от однокристальных микроЭВМ. В одном журнале даже была серия статей про него(не помню названия).

Я так понимаю прерывание возникает при поступлении сигнала на любой из битов любого порта?
Я так понимаю прерывание возникает при поступлении сигнала на любой из битов любого порта?

Только для лапы 2 порта P1, но можно выбрать при конфигурации и другие лапы и другие порты.
UFO just landed and posted this here
Можете выкладывать содержимое .h файлов из примеров (в данной статье это msp430f2274.h), чтобы можно было повторить программу и в других средах, или даже на ассемблере?
Выложил.
.h файлы для других микроконтроллеров лежат в папке \Program Files\IAR Systems\Embedded Workbench 6.0 Kickstart\430\inc
Спасибо большое, просто не ставить же этого монстра ради маленького файла, тем более, что он вроде как только в Windows работает. Я изучаю этот МК на ассемблере nasken430asm, компактный быстрый компилятор и отладчик. Просто сам ассемблер нравится, наследник PDP-11, похож на ассемблер БК-0010, на котором я в юности успел попрограммировать.
Помню, впервые познакомился с этими процессорами, когда искал сверхмаломощные контроллеры. Выбор пал на msp430 после статьи MSP430 Low Power Experiment. Два (2) месяца, или 60 дней контроллер считал на LCD-лисплее цифры от 0 до 9 питаясь от 2х кондёров (ионисторах) по 10Ф.

Ну а «Chronos» может прожить до 2-х лет на одной батарейке, и это при наличии радио модема.
Это отключение функции watchdog, которая иначе перезапустит MCU через некоторое время, если за ней не следить. Можно написать так:
WDTCTL = WDTPW | WDTHOLD;
В следующих статьях обязательно расскажу подробнее про все возможности watchdog. В этот раз не получилось — слишком много материала.
А почему код примера не на Cи? Как я помню поддержка языка была. Си был бы понятен большему кругу людей. ИМХО.
Это C++.
Хотя конечно почти никакой специфики C++ в примере нет.
Я очень сильно привык к прелестям ООП и поэтому программы побольше, чем эта, всегда всегда пишу с применением классов.
Во-первых, в C давно уже не нужно писать вместо списка аргументов void, если функция не принимает аргументов.

Во-вторых, объявление переменной в цикле
  for(volatile unsigned int i = 30000; i != 0; i--); 
есть в стандарте C99.

Во всех остальных частях кода нет даже отдалённого намёка на специфику C++.
Про переменную в цикле я знал, а вот про void — нет. Спасибо.
Похоже, я получил незаслуженный плюс. Кто-нибудь, заминусуйте мой верхний коммент, что бы ни дай бог кто-нибудь не воспользовался вредной информацией.

Позор мне за такой пробел в знаниях! Оказывается, если в C оставить список аргументов пустым, то функция может принимать любое число аргументов любых типов. А в C++ это значит, что функция не принимает аргументов. А я уже столько кода написал без void, блин…

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

И главное, как в функции получить доступ к этим аргументам, если макросу va_start нужно передать аргумент функции, после которого идёт многоточие?
Вроде как пустой список аргументов в C задумывался только для прототипирования. В функциях, которым реально нужно обрабатывать переменное количество аргументов таки нужно явно писать первый параметр и многоточие.
Если специфики нет, то надо смотреть какой язык включен в IAR в качестве языка разработки (ALT+F7, далее «General Options->C/C++ Compiler->Language»… там выбор языка), затем нужно, опять же, говорить о компиляторе, а не о языке, ибо компилятор может не полностью соответствовать спецификации, тем более что С++ там поименован как Embedded C++ / extended Embedded.

Следующий вопрос в том, как компилируется код, думаю точнее «свою мысль донести до компилятора» можно на ASM, затем наверно С, потом С++… (Мое личное мнение). Да и вызывать функции класса, чтобы «дрюкнуть» ножкой — как то мне кажется неправильно… Если писать на ASM не сильно продуктивно, и если позволяет память, то, наверное, следует использовать С. То С++ не тот язык, на котором я бы стал писать под MSP430

Когда речь идёт о системах реального времени, в которых необходимо обрабатывать большие объемы данных, то безусловно наилучшем решением является ASM. Ни один компилятор не донесёт до микроконтроллера Ваши мысли лучше Вас самих.
Но если говорить о системах, которые выполняют не большое количество задач, да ещё и с небольшими требованиями к задержкам, то можно использовать любой удобный язык.
В частности C++ в разы повышает скорость разработки. Классы которые я отписывал раньше, с минимальными изменениями, идут в следующие проекты, при этом не ухудшая читабельность кода. Я не опровергаю мысль о том, что это, может быть, не рационально, но сроки разработки часто играют большую роль.
… также тупо куски кода (без классов) идут в следующие проекты…
С потерей читабельности, а соответственно, сложностями при сопровождении.
Да неее, kirill89, хорошо комментированный код, правильно названные переменные…
Не надо перетягивать одеяло на свою сторону, кому то так удобнее, кому то так…

я вот после 5 лет работы с msp430 уволился с работы,
в другой конторе открыл для себя заново (со времен института) Протеус,
ща моделирую в нем… достаточно удобно позволяет при отсутствии железа работать…

Многие нос воротят, а куда деваться, если железки нет…

На прошлой работе всегда железки были… даже вопроса не возникало о симуляторе
А не могли бы вы как-нибудь таймеры осветить, в частности с режимами вывода на основе таймеров (которые OUTMOD), а то с прерываниями по таймеру разобрался, а это что-то не понимаю.
Хорошо, когда буду писать про таймеры, обязательно включу.
эм…
1. В разных IDE работа с прерываниями будет разной. Другие макросы или названия обработчиков векторов прерываний.

2. Говоря о прерываеиях обязательно нужно говорить и о сохранении и восстановлении состояний регистров (что делается не всегда автоматически).

3. Прерывания бывают программные.

Ну хотя бы это уж нужно было рассказать )
Действительно, в зависимости от IDE, будут отличия. В прошлой статье я писал о причинах выбора именно этой IDE.
UFO just landed and posted this here
По-моему, надо руки обрывать за такое использование volatile.

Не будьте так критичны. Я учился работать с MSP430 по официальным примерам от Texas Instruments, и там volatile для организации задержки используется достаточно часто.
Что бы не быть голословным, вот ссылка, откроем, например, файл msp430x22x4_uscia0_irda_01.c, 62 строка:
for (i = 1000; i; i--); // Small delay
Выше есть объявление (37 строка):
volatile unsigned int i;
UFO just landed and posted this here

Мне кажется, что вы драматизируете. На картинке снимки экрана, где виден процесс выполнения в обоих случаях.
UFO just landed and posted this here
Знаете, а самое забавное, что ровно сегодня я готовил материал для следующей статьи и наткнулся на другой пример кода в том же архиве в файле msp430x22x4_wdt_05.c.
...
for (;;)
  {
    volatile unsigned int i;

    P1OUT ^= 0x01; // Toggle P1.0 using exclusive-OR

    i = 50000; // Delay
    do (i--);
    while (i != 0);
...

Тут используется локальная переменная.

Я не берусь обсуждать стандарты языка, по скольку не считаю себя отличным C/C++ программистом. Повторюсь, я учился работать с контроллером по официальным примерам и документациям, и если там содержались ошибки, связанные со стандартом языка, они вполне могли быть перенесены на мой код.
Если Вы уверены в своей правоте, я бы рекомендовал сообщить в техническую поддержку TI об ошибках в коде примеров.
Sign up to leave a comment.

Articles