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

Сергей Борщ

Модератор
  • Постов

    10 863
  • Зарегистрирован

  • Посещение

  • Победитель дней

    28

Весь контент Сергей Борщ


  1. Огромное спасибо! Странно, что гугля не выводил на эти страницы.
  2. Я так понимаю, вам повезло больше, чем мне. Я не нашел ничего. Не могли бы вы поделиться ссылкой на эти упоминания/спецификации? :) Вот о ней я, признаюсь, не подумал. На это я как-то не обратил внимания, спасибо.
  3. А вы на название ветки внимания не обратили?
  4. Логично. 26 бит в PLLSTAT выставляется аппаратно, о чем симулятор, скорее всего, не знает. Чтобы проскочить это место нужно либо вручную взвести в окне памяти нужный бит в нужной ячейке, либо временно добавить в предыдущий код строчку, взводящую этот бит. Вас смущает, что строки идут не по порядку адресов? Да, я это упоминал в четвертом вопросе первого поста. А в самом коде криминала не видно, кроме записи слова в байтовый PLLFEED. Не знаю, как отреаирует на это живой кристалл. Скорее всего нормально, там регистры идут с шагом 4 байта. Отступление: Аналог Девайс вот умудрились в своих ADuC70xx сделать трехбайтовый регистр FEESIGN. Какой командой они планировали в него писать? Скорее это файлы, которые он показывает в дереве проекта. А что будет компилиться - зависит от makefile. Во всяком случае так происходит, если при создании проекта выбрать makefile project. У меня он ищет makefile в каталоге проекта, т.е. в том, где лежат .cproject и .project. А уже все подкаталоги создает makefile относительно своего расположения.
  5. Именно это я и имел ввиду. В GCC есть возможность указать компилятору, какие регистры (или память) портит асм-вставка, поэтому компилятор имеет возможность сохранить их или использовать в остальном коде оставшиеся свободными регистры. Также есть возможность не указывать регистр явно, а просто указать "регистр из такой-то группы" и компилятор сам подставит свободный на данном участке кода регистр. Таким образом "криминального" влияния на кодогенерацию нет.
  6. Компиляторы бывают разные. Использование инлайн-асма в GCC безопасно, ибо он имеет инструменты сообщить компилятору что именно затрагивает ваша функция. У ИАР такой возможности нет, поэтому компилятор пытается подстраховаться и в инструкции прямо написано пожелание не использовать асмовые вставки. Вместо этого в компилятор встроены intrinsic-функции __disable_interrupts(), __no_operation(), __reset_watchdog() и т.д. Надо внимательно смотреть документацию на ваш компилятор. Угу. "Резистор хорошо, но транзистор круче!" - смысл примерно тот же. intrinsic и inline - совершенно ортогональные понятия, поэтому сравнивать их просто некорректно.
  7. Наверное, у вас где-то ошибка в программе. Пожалуй, телепатически трудно диагностировать что-то более конкретное ;). Это программа управления новой зенитной ракеты или есть какие-то другие основания держать ее в строгом секрете? Всю показывать не обязательно, можно выкинуть все лишнее. Часто уже на этапе отсекания лишнего ошибка находится. Функция получает какие-то параметры? Попробуйте передавать ей константы - возможно виновата не функция, а просто передаваемые ей значения портятся еще до вызова функции.
  8. Посмотрите вчерашнюю ветку. Возможно и у вас что-то подобное.
  9. У меня такое мнение: если речь идет о периферии, то однозначно маски. Потому что регистры периферии объявлены как volatile и при использовании битовых полей при всем желании не получится заставить компилятор занести значения сразу в два или более полей, а это часто необходимо. Также часто необходимо просто присвоить всему регистру начальное значение, и это тоже невозможно при использовании битовых полей - приходится битовое поле заворачивать в union и в итоге писанины получается намного больше. А там, где много лишнего текста, потенциально будут ошибки. А вот при работе с данными, напротив, использование битовых полей позволяет нудную работу (&=~, |= и вычисление масок) свалить на компилятор. Он, в большинстве случаев, сделает точно такой же код, как и если бы я писал с масками, но исходник при этом будет менее захламлен, а значит читать его будет легче и вероятность ошибиться будет меньше.
  10. sergeeff Jr: Расшифруйте, пожалуйста, понятие "моргает неадекватно". Потому что формируемые ими задержки будут длиннее желаемых если обрабатыватся какие-либо прерывания. Причем могут быть длиннее на несколько тактов, а могут во много-много раз. То есть вы знаете, что переменная wait_ms должна быть volatile, но сознательно не объявляете ее такой? Весьма смелый ход! Желаем получить максимум удовольствия от этих вами же заботливо разложенных граблей.
  11. Мне кажется, P1IFG можно устанавливать только однажды, в процессе инициализации - он ведь не сбрасывается автоматически при переходе по вектору. А дальше рулить только P1IE. Мелочь, но несколько тактов и байтов экономится.
  12. Тошиба 11 декабря прошлого года анонсировала новые аккумуляторы, которые по характеристикам должны вытеснить напрочь все остальные: SCiB, a Safe, long-life, rapid charge battery to come to market in March 2008. Обещанный март прошел, но гугля на запрос "SCiB" дает только ссылки на перепечатки этого анонса, датированные 11-13 декабря и огрызок одного кино, как они эти батарейки ломают: Toshiba crushes SCiB battery На сайте Тошибы по этим батарейкам тоже полная тишина. Это я неправильно ищу, или это происки остальных производителей, почуствовавших приближение полной ж.?
  13. "По-вашему" - вполне вероятно. Но по стандарту должно быть иначе: И раз есть отличие от стандарта, то оно должно быть явно указано в документации (например, в документации на микрочиповский C18 такое описание есть). А если в документации оно не упомянуто, то, извините, или бага или этот компилятор не может называться "компилятором языка высокого уровня С"
  14. Там используется любое ненужное прерывание. Например в последних правках порта под AVR будет прерывание готовности флеша, которое нужно только в загрузчике, а писать загрузчик под ОС несколько... необычно. Выбирайте любое прерывание (желательно самое низкоприоритетное из доступных), которое вы можете вызвать программно (т.е. установить его флаг) и поправьте под него scmRTOS_TARGET_CFG.h Можно, если программа будет успевать и вам не жалко потребляемого тока на лишние действия. Поэтому вариант с прерыванием лучше.
  15. В 20080411 поправили eeprom. То есть все компилится, в железе не пробовал.
  16. Да, выходит, это еще одно несоответствие стандарту этого компилятора. Можно написать проще: unsigned int d = (unsigned int)s << 4;
  17. Я тоже излазил эти окна, но так и не нашел, где там указывать новые ключевые слова. Не пробовал, но попытаюсь на основе борьбы с внутрисхемным отладчиком: Пусто. Я пробовал указывать командный файл, но он почему-то приделывал к этому файлу цыгвиновский путь и не находил. Решил иначе, см. ниже. два варианта - либо перечислить команды на этой вкладке либо вписать там команду source <имя файла> и в этом файле уже указать команды. Команды должны быть примерно следующие: target remote localhost:1212 #simulavr слушает на порту 1212 load #загрузить .elf в память симулятора break main #по желанию. можно и break *0 - остановить на нулевом адресе. continue #бежать до точки останова. перед этим надо запустить simulavr. Попробуйте, вдруг поможет. Более детально описание команд для вкладки Commands нужно смтореть в описании simulavr и gdb. Как их вводить вручную во время отладки я пока не нашел.
  18. Warning[Pa079]:

    vet абсолютно прав, за исключением того, что "вызов RestoreChar правильно" - будет в обоих случаях. Порядок вычисления аргументов может зависить от чего угодно, вплоть до расположения звезд (точнее, от алгоритма оптимизатора, но это примерно эквивалентно ;) ). Если вам не нравится первый вариант - заведите две временных переменных и присвойте им значения одновременно с увеличением индекса. Если таких мест много, можно все это обернуть в #define (args) do { .... } while(0). Если эта программа портирована с какого-то компилятора, и тот компилятор не выдавал подобного предупреждения - он был сильно не прав.
  19. А посмотрите внимательно, допускает ли ваше АЦП такую скважность у тактового сигнала. На семинарах Analog Devices категорически не рекомендовали использовать тактовую MK для тактирования АЦП. Ибо АЦП очень чувствительны к джиттеру и прочим нестабильностям (даже шумам) тактового сигнала: AN-282: Fundamentals of Sampled Data Systems, стр. 13, AN-280: Mixed Signal Circuit Technologies стр. 28 и Analog-to-Digital Converter Clock Optimization: A Test Engineering Perspective. Они рекомендовали либо тактировать МК через буфер от АЦП, либо использовать схему восстановления тактового сигнала - отдельный генератор, синхронизируемый тактовым сигналом МК. У них даже есть спец. микросхемы для этого: Clock and Data Recovery/Retiming
  20. Но Flags должен быть volatile, также как и tmp. Лучше сразу писать правильно, чем ждать, когда начнется "при чем". Есть еще одно потенциальное место для бага: Flags &= ~DISPLAY; Оно компилируется примерно в такое: register Tmp = Flags; (1) Tmp = Tmp & DISPLAY; (2) Flags = Tmp; (3) Что произойдет, если между командами 1 и 3 произойдет прерывание, изменяющее Flags? Обращения к подобным переменным надо делать атомарными, т.е. с запретом прерываний. Попробуйте присваивать tmp в прерывании константу, т.е. исключите АЦП из получения результата.
  21. А в файле с исходным текстом указано, что вектора надо класть в секцию vectors? Сделайте дизассемблерный файл и посмотрите, куда они попали на самом деле.
  22. Либо использовать --section-start (см. FAQ в папке документации), либо (что мне кажется более правильным) скопировать скрипт линкера в папку проекта, поправить его как нужно и указать этот скрипт линкеру (-Wl,-T,<имя скрипта>)
  23. А для кого придуманы теги [ code ] и [ /code ]? Зачем сделали кнопку с символом '#' в форме ввода сообщения? Покажите объявления всех использованых переменных и прототипы функций. Вы хотите, чтобы вам помогли или поиграть в партизана и телепатов?
  24. Так мы можем спорить до бесконечности. Для простоты мой предыдущий пост можно свести к более короткому: интернета там нет. Вообще.
  25. Понятия не имею, как это делается в студии (пользуюсь Eclipse), но сильно сомневаюсь. Заголовочные (include files, header) файлы и файлы с исходным кодом (source) - очень разные файлы. На вашей картинке видно, что проект состоит всего из одного .c - файла (в левом окне ветка source files). Попробуйте понажимать там левую-правую кнопки мыши, наверняка появится меню добавления файла.
×
×
  • Создать...