|
Зарезервированные слова IAR |
|
|
|
Dec 27 2011, 19:07
|
Участник

Группа: Участник
Сообщений: 16
Регистрация: 25-11-11
Пользователь №: 68 522

|
Начинаю вникать в MSP430G2, купил LAunchPad и решил начать с осмысливания программы "моргающий светодиод", разбирая прошитую программу. Насколько понял, WDTCTL, WDTPW, WDTHOLD - зарезервированные слова. Нашел их описание. К зарезервированным, насколько понял, относятся CCTL0, CCIE, TACTL ну и наверно другие. Где найти перечень всех зарезервированных слов для IAR и их описание?
|
|
|
|
|
Dec 28 2011, 05:38
|
Участник

Группа: Участник
Сообщений: 16
Регистрация: 25-11-11
Пользователь №: 68 522

|
Зарезервированными словами в языках программирования называют слова, имеющее специальное значение. Идентификаторы с такими именами запрещены. WDTCNT - это счетчик таймера. Это слово я не имею право использовать как переменую. Самый простой пример: попробуйте в виндозе создать файл с именем lpt. Скорее всего у вас ничего не получится, поскольку это слово зарезервировани под параллельный порт. Зато я могу в командах и программах при помощи этого слова обращаться к параллельному порту и наоборот, увидев слово lpt я знаю, что это не имя переменной, а конкретное оборудование. На моем этапе познания двойная задача: понять смысл слов, которые используются в программе, а с другой стороны надо бы знать какими словами мне в программе мне называть внутренние ресурсы микроконтроллера. Наверняка такой список есть, но где?
|
|
|
|
|
Dec 28 2011, 06:02
|

Частый гость
 
Группа: Участник
Сообщений: 98
Регистрация: 20-06-05
Пользователь №: 6 150

|
Цитата(Syber @ Dec 27 2011, 23:07)  Начинаю вникать в MSP430G2, купил LAunchPad и решил начать с осмысливания программы "моргающий светодиод", разбирая прошитую программу. Насколько понял, WDTCTL, WDTPW, WDTHOLD - зарезервированные слова. Нашел их описание. К зарезервированным, насколько понял, относятся CCTL0, CCIE, TACTL ну и наверно другие. Где найти перечень всех зарезервированных слов для IAR и их описание? В хелпах к нему. И в хидерных файлах, относящимся к МК проекта. Сам IAR не может знать все мыслимые и немыслимые буквосочетания. Эти слова называются предопределенными, и их дефайны не в IAR-е находятся.
|
|
|
|
|
Dec 28 2011, 07:22
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (Syber @ Dec 28 2011, 07:38)  Зарезервированными словами в языках программирования называют слова, имеющее специальное значение. Вы объявили переменную A. Стало ли "A" от этого зарезервированым словом компилятора? Нет, не стало. Так же как и перечисленные вами имена макроопределений. Список зарезервированых слов языка Си описан в стандарте: QUOTE 6.4.1 Keywords Syntax 1 keyword: one of
auto enum restrict unsigned break extern return void case float short volatile char for signed while const goto sizeof _Bool continue if static _Complex default inline struct _Imaginary do int switch double long typedef else register union Semantics 2 The above tokens (case sensitive) are reserved (in translation phases 7 and 8) for use as keywords, and shall not be used otherwise. Вот эти ключевые слова вы не можете использовать в качестве идентификаторов. Все остальные легальные буквосочетания разрешены. Другое дело, что кто-то мог уже использовать их до вас - в заголовочных файлах, например. Чтобы снизить вероятность конфликтов приняты некоторые соглашения. Например: имена идентификаторов, начинающиеся с подчеркивания, зарезервированы за разработчиками библиотк компилятора. Пример таких имен - __disable_interrupt(), __no_operation(). Также есть соглашение, что имена макроопределенний пишутся заглавными буквами. QUOTE (Syber @ Dec 28 2011, 07:38)  На моем этапе познания двойная задача: понять смысл слов, которые используются в программе, а с другой стороны надо бы знать какими словами мне в программе мне называть внутренние ресурсы микроконтроллера. Наверняка такой список есть, но где? Имена регистров конкретного контроллера вы найдете в заголовочном файле от вашего конкретного контроллера. Там они почти всегда совпадают с именами из даташита. Поскольку каждый производитель выдумывает свои имена для регистров, битов и их сочетаний даже для почти одинаковых контроллеров одного семейства - единого списка нет и быть не может, ибо он будет отличаться для каждого конкретного контроллера. Просто используйте для ваших переменных и макроопределений осмысленные имена и с большой долей вероятности вы не пересечетесь с именами регистров или битов.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Dec 28 2011, 07:42
|

Шаман
     
Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221

|
Цитата(Сергей Борщ @ Dec 28 2011, 09:22)  Пример таких имен - __disable_interrupt(), __no_operation(). Да, есть такие слова. Это так называемые интринсики (прошу прощения за вольную транскрипцию), которым соответствует вполне определённый код и перечень которых можно найти в одноимённом заголовочном файле у IAR. Но есть ещё слова, которым не соответствует код, но которые оказывают влияние на его генерацию. И в этом плане IAR весьма плодовит. Информацию о таких словах (__task, __interrupt, __x_z, и т. д., для каждого семейства МК - свой набор) как правило в pdf описаниях можно найти, но не всю. Нужно также листать различные chahge notes с их сайта или из установочной директории. Надо сказать, что все эти примочки не соответствуют никаким стандартам, что затрудняет написание переносимого кода.
|
|
|
|
|
Dec 28 2011, 15:05
|
Участник

Группа: Участник
Сообщений: 16
Регистрация: 25-11-11
Пользователь №: 68 522

|
По поводу зарезервированных слов. Си имеет такие слова, но их (зарезервированные слова) должны иметь и файлы, которые дают понять IAR тип устройства, с которым он работает. Слово А резервирует программист, а специфичные слова для конкретного устройства резервируются каким-то другим файлом и для пользователя уже нет разницы на каком уровне произошло резервирование. Подозреваю, что в моем случае это msp430g2231.h. Чей он? Ведь его я получил с IAR. Сам изобретать имена для ресурсов микроконтроллера не хочу, иначе трудно будет читать чужие программы. Цитата(ut1wpr @ Dec 28 2011, 10:02)  В хелпах к нему. И в хидерных файлах, относящимся к МК проекта. Сам IAR не может знать все мыслимые и немыслимые буквосочетания. Эти слова называются предопределенными, и их дефайны не в IAR-е находятся. Документации слишком много. Это и сайт TI, и документы в директории установленной IAR. Пока в хелпах ничего не нашел, пороюсь еще. Что такое хидерные файлы? Это то, что подгружается: #include <msp430g2231.h> Может подскажите хотя бы имена файлов.
|
|
|
|
|
Dec 29 2011, 17:58
|
Участник

Группа: Участник
Сообщений: 16
Регистрация: 25-11-11
Пользователь №: 68 522

|
Спасибо, нашел. Там дефиниций на 13 листов вордовского текста.
|
|
|
|
|
Dec 30 2011, 11:52
|

Профессионал
    
Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555

|
Цитата(Syber @ Dec 28 2011, 19:05)  Чей он? Ведь его я получил с IAR. Простоквашино смотрели? Цитата -А вот интересно, чей он? Цитата Спасибо, нашел. Там дефиниций на 13 листов вордовского текста. так меняя настройки шрифта и страницы можно получить практически любое число страниц  все эти слова не являются зарезервированными, зарезервированы только те, которые нельзя определить/переопределить в тексте программы! у IAR обычно имена регистров и их битов совпадают с даташитом, поэтому лучше смотреть в даташит, и достаточно посмотреть пару примеров из комплекта IAR. Топикстартеру бы рекомендовал для начала попробовать написать на С что то для обычного компа не используя Visual Studio, Broland..., а например GNUC и обычный текстовый редактор. Может быть придет понимание некоторых терминов... откуда .h файлы берутся...
|
|
|
|
|
Jan 12 2012, 18:17
|
Участник

Группа: Участник
Сообщений: 16
Регистрация: 25-11-11
Пользователь №: 68 522

|
А что там в Простоквашино?
По поводу зарезервированных слов можно море копий сломать, но это не принципиально, поскольку суть сказанного меня поняли и помогли. По поводу 13 листов. Для налоговой могу напечатать шрифтом 5 пунктов. Для себя и в деловой переписке использую Times, 12 пунктов, одинарный межстрочный. Не знаю, утвержденный ли это стандарт, но пользуются многие. Именно в этом стандарте 13 листов. Но вот поднял документацию на IAR, получилось что эти 13 листов сущие пустяки.
По поводу программирования. Скарябал на ассемблере для Электроники 60, а это PDP-11 DEC. Для нее же писал на кроссассемблере разработки Протвино. Но пока позволят ресурсы, хочу попрактиковать на С. На нем тоже писал, но тут начались непонятки. Я понимаю вот такую конструкцию: a = b & c Но не могу понять строки из примера с моргающим диодом: LED_OUT &= ~(LED_0 + LED_1) Описание С нашел в EW430_CompilerReference.pdf. Там много интересного, но нет описания операторов применительно к IAR.
|
|
|
|
|
Jan 12 2012, 19:48
|

Гуру
     
Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237

|
Цитата(Syber @ Jan 12 2012, 22:17)  Но не могу понять строки из примера с моргающим диодом: LED_OUT &= ~(LED_0 + LED_1) Это типаж, когда устанавливают биты по маске. Маска - это определение набора битов в виде двоичного числа, в котором нужные биты установлены в 1. Например, маски для каждого из пинов 8-битного порта будут такими: #define PIN1 1 #define PIN2 2 #define PIN3 4 #define PIN4 8 #define PIN5 16 #define PIN6 32 #define PIN7 64 #define PIN8 128 Если к пину PIN3 присоединен светодиод LED_0, то LED_0=8 будет маской, его зажигающей. Чтобы зажечь этот светодиод, надо подать напряжение на этот пин, а для этого нужно эту маску установить в порту: LED_OUT |= PIN3; или LED_OUT |= LED_0; Это тоже типаж, т.к. операция |=осуществляет логическое сложение. А поскольку у нас в маске только один бит, то только он и ДОБАВИТСЯ! Присваивать напрямую LED_OUT = LED_0; в таких случаях нельзя, т.к. тогда обнулятся другие биты, а вместе с этим исчезнут напряжения на остальных пинах. А вот если надо СТЕРЕТЬ какой-то один бит, то стирают его так: LED_OUT &= ~LED_0; Выглядит вычурно  , но делает то, что нужно. Т.е. сначала инвертирует маску, а потом "фильтрует" через нее старое значение. В результате чего из LED_OUT сотрется только бит LED_0, а остальные биты в нем сохранятся неизменными. Тот же механизм работает, если в маске более одного бита. Например, выражение LED_0+LED_1 - это маска обоих светодиодов. Ее можно записать и так LED_0|LED_1. Поэтому, если надо зажечь СРАЗУ оба светодиода, то зажигают их так: LED_OUT |= (LED_0+LED_1); а гасят так: LED_OUT &= ~(LED_0+LED_1); Но так светодиоды зажигаются, если они горят на напряжении, выдаваемом контроллером. Но можно (и даже лучше) зажигать светодиод, присоединяя один из его выводов через гасящий резитор к плюсу питания, а другой его вывод заземлять через пин контроллера. В этом случае наши операции станут работать наоборот. LED_OUT |= (LED_0+LED_1); будет гасить, а LED_OUT &= ~(LED_0+LED_1); будет зажигать.
|
|
|
|
|
Jan 13 2012, 06:42
|
Участник

Группа: Участник
Сообщений: 16
Регистрация: 25-11-11
Пользователь №: 68 522

|
Цитата(Палыч @ Jan 12 2012, 23:02)  Но, чтобы были нестандартные операторы - не Что же вы так за слова цепляетесь. Мне что, полстраницы тратить на то, что вы компилятор IAR назвали транслятором? Не буду на это отвлекаться. Я сказал не о нестандартных операторах а о каком-то нестандартном их применении, о нестандартных комбинациях. И даже привел пример. Меня всегда учили делать программу наглядной и легко читаемой. Цитата(KRS @ Jan 12 2012, 23:44)  а такую конструкцию a &= b; вы понимаете? Такого не видел. Это эквивалент a = a & b ? Если да, то он менее нагляден. Зачем так писать? Код экономится или причина другая? Xenia, у меня вопрос не о механизме управления портам, вопрос о синтаксисе языка С IAR. Правильно ли я понимаю, что конструкцию LED_OUT &= ~(LED_0 + LED_1) Можно записать как: LED_OUT = LED_OUT & ~(LED_0 + LED_1) Аналогично побитовое включающее ИЛИ: LED_OUT |= LED_0 Можно записать: LED_OUT = LED_OUT | LED_0
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|