Comments 32
Спасибо за статью. Вспоминается шуточный код по теме:
Прикольная штука, раньше фанател просто от однокристальных микроЭВМ. В одном журнале даже была серия статей про него(не помню названия).
Я так понимаю прерывание возникает при поступлении сигнала на любой из битов любого порта?
cli
hlt
Прикольная штука, раньше фанател просто от однокристальных микроЭВМ. В одном журнале даже была серия статей про него(не помню названия).
Я так понимаю прерывание возникает при поступлении сигнала на любой из битов любого порта?
+1
Можете выкладывать содержимое .h файлов из примеров (в данной статье это msp430f2274.h), чтобы можно было повторить программу и в других средах, или даже на ассемблере?
0
Выложил.
.h файлы для других микроконтроллеров лежат в папке \Program Files\IAR Systems\Embedded Workbench 6.0 Kickstart\430\inc
.h файлы для других микроконтроллеров лежат в папке \Program Files\IAR Systems\Embedded Workbench 6.0 Kickstart\430\inc
+1
Спасибо большое, просто не ставить же этого монстра ради маленького файла, тем более, что он вроде как только в Windows работает. Я изучаю этот МК на ассемблере nasken430asm, компактный быстрый компилятор и отладчик. Просто сам ассемблер нравится, наследник PDP-11, похож на ассемблер БК-0010, на котором я в юности успел попрограммировать.
0
Помню, впервые познакомился с этими процессорами, когда искал сверхмаломощные контроллеры. Выбор пал на msp430 после статьи MSP430 Low Power Experiment. Два (2) месяца, или 60 дней контроллер считал на LCD-лисплее цифры от 0 до 9 питаясь от 2х кондёров (ионисторах) по 10Ф.
Ну а «Chronos» может прожить до 2-х лет на одной батарейке, и это при наличии радио модема.
Ну а «Chronos» может прожить до 2-х лет на одной батарейке, и это при наличии радио модема.
0
WDTCTL = WDTPW + WDTHOLD;
WTF??
WTF??
0
А почему код примера не на Cи? Как я помню поддержка языка была. Си был бы понятен большему кругу людей. ИМХО.
0
Это и есть Си.
+1
Это C++.
Хотя конечно почти никакой специфики C++ в примере нет.
Я очень сильно привык к прелестям ООП и поэтому программы побольше, чем эта, всегда всегда пишу с применением классов.
Хотя конечно почти никакой специфики C++ в примере нет.
Я очень сильно привык к прелестям ООП и поэтому программы побольше, чем эта, всегда всегда пишу с применением классов.
0
Во-первых, в C давно уже не нужно писать вместо списка аргументов void, если функция не принимает аргументов.
Во-вторых, объявление переменной в цикле
Во всех остальных частях кода нет даже отдалённого намёка на специфику C++.
Во-вторых, объявление переменной в цикле
for(volatile unsigned int i = 30000; i != 0; i--);
есть в стандарте C99.Во всех остальных частях кода нет даже отдалённого намёка на специфику C++.
-1
Про переменную в цикле я знал, а вот про void — нет. Спасибо.
0
Похоже, я получил незаслуженный плюс. Кто-нибудь, заминусуйте мой верхний коммент, что бы ни дай бог кто-нибудь не воспользовался вредной информацией.
Позор мне за такой пробел в знаниях! Оказывается, если в C оставить список аргументов пустым, то функция может принимать любое число аргументов любых типов. А в C++ это значит, что функция не принимает аргументов. А я уже столько кода написал без void, блин…
Но тогда я не понимаю, как это будет работать? Ведь аргументы кладутся в стек, а компилятор не знает наперёд, сколько аргументов и каких будет в стеке — особенно, если функция будет торчать наружу из какой-нибудь библиотеки.
И главное, как в функции получить доступ к этим аргументам, если макросу va_start нужно передать аргумент функции, после которого идёт многоточие?
Позор мне за такой пробел в знаниях! Оказывается, если в C оставить список аргументов пустым, то функция может принимать любое число аргументов любых типов. А в C++ это значит, что функция не принимает аргументов. А я уже столько кода написал без void, блин…
Но тогда я не понимаю, как это будет работать? Ведь аргументы кладутся в стек, а компилятор не знает наперёд, сколько аргументов и каких будет в стеке — особенно, если функция будет торчать наружу из какой-нибудь библиотеки.
И главное, как в функции получить доступ к этим аргументам, если макросу va_start нужно передать аргумент функции, после которого идёт многоточие?
+2
Если специфики нет, то надо смотреть какой язык включен в IAR в качестве языка разработки (ALT+F7, далее «General Options->C/C++ Compiler->Language»… там выбор языка), затем нужно, опять же, говорить о компиляторе, а не о языке, ибо компилятор может не полностью соответствовать спецификации, тем более что С++ там поименован как Embedded C++ / extended Embedded.
Следующий вопрос в том, как компилируется код, думаю точнее «свою мысль донести до компилятора» можно на ASM, затем наверно С, потом С++… (Мое личное мнение). Да и вызывать функции класса, чтобы «дрюкнуть» ножкой — как то мне кажется неправильно… Если писать на ASM не сильно продуктивно, и если позволяет память, то, наверное, следует использовать С. То С++ не тот язык, на котором я бы стал писать под MSP430
Следующий вопрос в том, как компилируется код, думаю точнее «свою мысль донести до компилятора» можно на ASM, затем наверно С, потом С++… (Мое личное мнение). Да и вызывать функции класса, чтобы «дрюкнуть» ножкой — как то мне кажется неправильно… Если писать на ASM не сильно продуктивно, и если позволяет память, то, наверное, следует использовать С. То С++ не тот язык, на котором я бы стал писать под MSP430
+1
Когда речь идёт о системах реального времени, в которых необходимо обрабатывать большие объемы данных, то безусловно наилучшем решением является ASM. Ни один компилятор не донесёт до микроконтроллера Ваши мысли лучше Вас самих.
Но если говорить о системах, которые выполняют не большое количество задач, да ещё и с небольшими требованиями к задержкам, то можно использовать любой удобный язык.
В частности C++ в разы повышает скорость разработки. Классы которые я отписывал раньше, с минимальными изменениями, идут в следующие проекты, при этом не ухудшая читабельность кода. Я не опровергаю мысль о том, что это, может быть, не рационально, но сроки разработки часто играют большую роль.
Но если говорить о системах, которые выполняют не большое количество задач, да ещё и с небольшими требованиями к задержкам, то можно использовать любой удобный язык.
В частности C++ в разы повышает скорость разработки. Классы которые я отписывал раньше, с минимальными изменениями, идут в следующие проекты, при этом не ухудшая читабельность кода. Я не опровергаю мысль о том, что это, может быть, не рационально, но сроки разработки часто играют большую роль.
-1
… также тупо куски кода (без классов) идут в следующие проекты…
0
С потерей читабельности, а соответственно, сложностями при сопровождении.
-1
Да неее, kirill89, хорошо комментированный код, правильно названные переменные…
Не надо перетягивать одеяло на свою сторону, кому то так удобнее, кому то так…
я вот после 5 лет работы с msp430 уволился с работы,
в другой конторе открыл для себя заново (со времен института) Протеус,
ща моделирую в нем… достаточно удобно позволяет при отсутствии железа работать…
Многие нос воротят, а куда деваться, если железки нет…
На прошлой работе всегда железки были… даже вопроса не возникало о симуляторе
Не надо перетягивать одеяло на свою сторону, кому то так удобнее, кому то так…
я вот после 5 лет работы с msp430 уволился с работы,
в другой конторе открыл для себя заново (со времен института) Протеус,
ща моделирую в нем… достаточно удобно позволяет при отсутствии железа работать…
Многие нос воротят, а куда деваться, если железки нет…
На прошлой работе всегда железки были… даже вопроса не возникало о симуляторе
0
А не могли бы вы как-нибудь таймеры осветить, в частности с режимами вывода на основе таймеров (которые OUTMOD), а то с прерываниями по таймеру разобрался, а это что-то не понимаю.
0
эм…
1. В разных IDE работа с прерываниями будет разной. Другие макросы или названия обработчиков векторов прерываний.
2. Говоря о прерываеиях обязательно нужно говорить и о сохранении и восстановлении состояний регистров (что делается не всегда автоматически).
3. Прерывания бывают программные.
Ну хотя бы это уж нужно было рассказать )
1. В разных IDE работа с прерываниями будет разной. Другие макросы или названия обработчиков векторов прерываний.
2. Говоря о прерываеиях обязательно нужно говорить и о сохранении и восстановлении состояний регистров (что делается не всегда автоматически).
3. Прерывания бывают программные.
Ну хотя бы это уж нужно было рассказать )
+1
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;
0
UFO just landed and posted this here
0
UFO just landed and posted this here
Знаете, а самое забавное, что ровно сегодня я готовил материал для следующей статьи и наткнулся на другой пример кода в том же архиве в файле msp430x22x4_wdt_05.c.
Тут используется локальная переменная.
Я не берусь обсуждать стандарты языка, по скольку не считаю себя отличным C/C++ программистом. Повторюсь, я учился работать с контроллером по официальным примерам и документациям, и если там содержались ошибки, связанные со стандартом языка, они вполне могли быть перенесены на мой код.
Если Вы уверены в своей правоте, я бы рекомендовал сообщить в техническую поддержку TI об ошибках в коде примеров.
...
for (;;)
{
volatile unsigned int i;
P1OUT ^= 0x01; // Toggle P1.0 using exclusive-OR
i = 50000; // Delay
do (i--);
while (i != 0);
...
Тут используется локальная переменная.
Я не берусь обсуждать стандарты языка, по скольку не считаю себя отличным C/C++ программистом. Повторюсь, я учился работать с контроллером по официальным примерам и документациям, и если там содержались ошибки, связанные со стандартом языка, они вполне могли быть перенесены на мой код.
Если Вы уверены в своей правоте, я бы рекомендовал сообщить в техническую поддержку TI об ошибках в коде примеров.
0
Sign up to leave a comment.
MSP430, учимся программировать и отлаживать железо (часть 2)