перенес и сразу понадобилось использовать extern!В обработчике то не видать адреса BuTTON.
Цитата:
Вот чтобы вас не пугать и не запутать, я и стёр то, что написал. Не беспокойтесь - для прерываний это не важно - пока вы не выйдете из прерывания, основная программа не продолжится. Но в настоящих многопоточных приложениях просто имейте это в виду. Подробности вы прочтете в "Барьеры памяти и компилятора". Например, тут: http://scrutator.me/post/2015/05/16/mem ... riers.aspx
Ознакомлюсь спасибо!!
Цитата:
На практике в модуле key.h вы пишете после #include extern uint8_t BuTTON;
И дальше работаете с этой переменной, как с глобальной.
После #include пишем extern uint8_t BuTTON; ??? попробовал без #include видится нормально.
Цитата:
Предупреждения и не будет. Это не ошибка. Кстати, у вас этот самый BuTTON стоит инициализировать.
Вам нужен модификатор volatile при объявлении переменной BuTTOn.
Интересное явление! При опросе кнопки по прерыванию я не мог перейти в меню, хотя в отладчике все прекрасно было видно значение BuTTON оно соответствовало для перехода,но не происходило.Заем функцию опроса поместил в основной цикл и запретил прерывания. Переход в меню происходил отлично, но мне нужно это делать в прерывании. Вернул все обратно в обработчик и добавил volatile к BuTTON, и о чудо,все заработало!! Спасибо огромное очень полезными вещами поделились
Только не воспринимайте, как догму эти статьи. Особенно в части оформления программы. Ну и могу ещё посоветовать систему контроля версий поставить. Например, модный сейчас Git (с графическим интерфейсом, например, мне нравится Git Extension). Но это для мелких проектов, возможно, особого смысла не имеет, но для крупных и ветвящихся - это спасение от кучи версий программы.
Там, где это позволит свести к минимуму внешние связи модуля. Чем меньше из него "торчит" наружу, тем надёжнее и предсказуемее работа. extern в чистой С-программе - это форс-мажор - давить нещадно, для функций он бессмысленен, для переменных - даёт всем кому не лень такую свободу обращения с вашими данными, которой окружающие не заслуживают, да и делает переменную уже никак не вашей - потому как контроля над тем, кто с ней побаловался, когда и как - у вас уже не будет. Резюме перфекциониста: Обработчик - в модуль клавиатуры вместе с известной переменной, которую делаем статической а кто хочет её почитать - пожалте им функцию get_cur_button. Ну и сказать оптимизатору - "Выноси, родима-а-й!"
В чем разница использования внешней переменной и работать просто с адресом переменной?
Теоретически [для встроенных типов размером меньше размера указателя] - в дополнительной операции разыменования для получения содержимого по адресу. Практически - скорее всего, компилятор и так будет оперировать указателем. Ну и для ясности понимания кода, тот кто будет его читать после вас наверняка подумает, что есть причина использования именно указателя вместо переменной - и потратит время на поиски этой причины. Пишите проще - и сами-же себе спасибо скажете через пару годиков, будь придётся нынешний код ещё куда встраивать.
Ну и могу ещё посоветовать систему контроля версий поставить.
пока не представляю,что это,но попробую разобраться
Цитата:
для переменных - даёт всем кому не лень такую свободу обращения с вашими данными, которой окружающие не заслуживают, да и делает переменную уже никак не вашей - потому как контроля над тем, кто с ней побаловался....
что это значит? если я эту переменную никак не использую по делу,как может программа к ней добраться и побпловаться?
Цитата:
Обработчик - в модуль клавиатуры вместе с известной переменной, которую делаем статической
что даст static.? то что только по делу можно ее поменять?т.е конкретно там где ее используют?
Цитата:
Практически - скорее всего, компилятор и так будет оперировать указателем
. Тоже так предполагал, казалось этими действиями я понижаю уровень языка!
что это значит? если я эту переменную никак не использую по делу,как может программа к ней добраться и побпловаться?
Дело в том, что переменную лучше "запереть" в модуле и изменять/получать значение только через функции этого модуля. Эдакая инкапсуляция.
Цитата:
что даст static.? то что только по делу можно ее поменять?т.е конкретно там где ее используют?
static для имени переменной делает её запертой внутри этого модуля. Доступ к такой переменной через объявление её же через extern в другом модуле не получится.
Цитата:
Тоже так предполагал, казалось этими действиями я понижаю уровень языка!
Не экономьте на спичках. Пишите так, как вам проще и удобнее. Пусть компилятор сам решит, как ему удобно работать с переменной - может, он её в регистре будет держать (впрочем, вашу с volatile не будет ).
Цитата:
пока не представляю,что это,но попробую разобраться
Это то, что позволит наглядно представлять и удобно переключаться между версиями вашей программы. Вы делаете "слепки" ("коммиты") рабочего каталога, когда они требуются (с комментариями).
Дело в том, что переменную лучше "запереть" в модуле и изменять/получать значение только через функции этого модуля. Эдакая инкапсуляция.
интересный случай!? в моем примере как это должно выглядеть?как мне до нее добраться из другого модуля МЕНЮ? написать функцию в модуле KEY которая просто передает мою переменную,а в модуле меню вызвать эту функцию?
Цитата:
static для имени переменной делает её запертой внутри этого модуля. Доступ к такой переменной через объявление её же через extern в другом модуле не получится.
действительно, попробовал так, extern не канает уже...
Цитата:
Пишите так, как вам проще и удобнее.
ок
Цитата:
Это то, что позволит наглядно представлять и удобно переключаться между версиями вашей программы.
интересный случай!? в моем примере как это должно выглядеть?как мне до нее добраться из другого модуля МЕНЮ? написать функцию в модуле KEY которая просто передает мою переменную,а в модуле меню вызвать эту функцию?
ну хорошо получил я ее,теперь мне нужно поменять ее значение в чужом модуле. что тоже писать функцию для этого? разврат какой-то
Нет, не разврат. Это инкапсуляция:
Цитата:
Инкапсуляция - это механизм, который объединяет данные и методы, манипулирующие этими данными, и защищает и то и другое от внешнего вмешательства или неправильного использования
В этой функции вы запретите прерывания, считаете/запишете переменную, снова разрешите прерывания. Для внешнего пользователя всё это не важно - он этого не замечает и не знает тонкостей работы с переменной. Это знает сам модуль.
Здравствуйте!своим наивным расчетом пытаюсь добраться к полю структуры вот таким образом:
Код:
for (typ8 i=0;i<3;i++) { TWI_buffer[i]=*(PtrRTC_struct+i); }
компилятр пишет : invalid type argument of unary '*' (have 'int') правильно ли я понимаю,что доступ к полю структуры это унарная операция, т.е для доступа нужно использовать только один аргумент.Но я же работаю адресом структуры....или причина не в этом?
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 15
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения