Jump to content

    

Twin_by

Участник
  • Content Count

    32
  • Joined

  • Last visited

Community Reputation

0 Обычный

About Twin_by

  • Rank
    Участник

Контакты

  • Сайт
    Array
  • ICQ
    Array

Информация

  • Город
    Array
  1. Всем привет. Не стал создавать новую тему. У меня собственно тоже терморегулятор только на ATtiny88. И проблема с АЦП. Как видно на скриншоте не соответствуют значения. Это идет самое первое измерение после включения. Второе уже показывает правильно. Вопрос почему значение BuffADC после присвоения не равно значению ADC?
  2. Всем здравствуйте! Решил покрутить в руках FreeRTOS на ATmega324A. Нашел статью http://makesystem.net/?p=1363#.VrDha41a9qA . И когда дело дошло до сборки посыпали ошибки: undefined reference to pvPortMalloc. Посмотрел где идет определение, а там стандартная конструкция "если не определен, то определить". Или я что то не понимаю. В чем может быть проблема? Архив с проектом прилагается osrv_v2.zip
  3. А я вот догадался, с вашей помощью кстати ))) Зато как красиво было ... Бинарник открываешь и в первой же строчке информация о версии прошивки. Но такой вариант оказался не рабочий. Огромное спасибо, что помогли замутить такую полезную штуку. В процессе я почерпнул много нового.
  4. Помогло. Сейчас собирается без предупреждений. И создается два пустых байта после строки содержащей четное количество символов, и один байт если строка содержит не четное количество символов. Но была другая большая проблема. После прошивки микроконтроллера, он отказывался обрабатывать прерывания. Поэтому *(.fw_version) KEEP(*(.fw_version)) . = ALIGN(2); перенес из начала секции .text чуть ниже после *(.vectors) KEEP(*(.vectors)). И вроде работает, прерывания и АЦП обрабатывает. Сейчас секция .text приняла следующий вид .text : { *(.vectors) KEEP(*(.vectors)) *(.fw_version) KEEP(*(.fw_version)) . = ALIGN(2); /* For data that needs to reside in the lower 64k of progmem. */ *(.progmem.gcc*) *(.progmem*) . = ALIGN(2); __trampolines_start = .; /* The jump trampolines for the 16-bit limited relocs will reside here. */ *(.trampolines) *(.trampolines*) __trampolines_end = .; /* For future tablejump instruction arrays for 3 byte pc devices. We don't relax jump/call instructions within these sections. */ *(.jumptables) *(.jumptables*) /* For code that needs to reside in the lower 128k progmem. */ *(.lowtext) *(.lowtext*) __ctors_start = .; *(.ctors) __ctors_end = .; __dtors_start = .; *(.dtors) __dtors_end = .; KEEP(SORT(*)(.ctors)) KEEP(SORT(*)(.dtors)) /* From this point on, we don't bother about wether the insns are below or above the 16 bits boundary. */ *(.init0) /* Start here after reset. */ KEEP (*(.init0)) *(.init1) KEEP (*(.init1)) *(.init2) /* Clear __zero_reg__, set up stack pointer. */ KEEP (*(.init2)) *(.init3) KEEP (*(.init3)) *(.init4) /* Initialize data and BSS. */ KEEP (*(.init4)) *(.init5) KEEP (*(.init5)) *(.init6) /* C++ constructors. */ KEEP (*(.init6)) *(.init7) KEEP (*(.init7)) *(.init8) KEEP (*(.init8)) *(.init9) /* Call main(). */ KEEP (*(.init9)) *(.text) . = ALIGN(2); *(.text.*) . = ALIGN(2); *(.fini9) /* _exit() starts here. */ KEEP (*(.fini9)) *(.fini8) KEEP (*(.fini8)) *(.fini7) KEEP (*(.fini7)) *(.fini6) /* C++ destructors. */ KEEP (*(.fini6)) *(.fini5) KEEP (*(.fini5)) *(.fini4) KEEP (*(.fini4)) *(.fini3) KEEP (*(.fini3)) *(.fini2) KEEP (*(.fini2)) *(.fini1) KEEP (*(.fini1)) *(.fini0) /* Infinite loop after program termination. */ KEEP (*(.fini0)) _etext = .; } > text
  5. Я тут поигрался немного с форматом строчки, о точнее с содержимым строки name_fw[]. И заметил такую закономерность. Что если в строке четное количество символов, то проект соберется и выдаст Warning на вектора прерываний. А если в строке не четное количество символов, то все соберется без предупреждений.
  6. Вроде получилось. проект собрался. Но выдал 21 предупреждения: c:/program files/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avr25/crttn88.o: In function `__vector_1': (.text+0x0)(0,0): warning: internal error: out of range error Все предупреждения касаются векторов прерывания.
  7. Что удалось узнать пока. Файлы ld Atmel Studio как таковые не использует. Она использует файлы в папке c:\WinAVR-20100110\avr\lib\ldscripts\avr2.* (avr2.* имеет поддержку процессора Attiny88 http://microsin.net/programming/avr/avr-gcc-options.html ) имеющие следующие описание: *.x script file is the default script *.xr script is for linking without relocation (-r flag) *.xu script is like .xr but *do* create constructors (-Ur flag) *.xn script is for linking with -n flag (mix text and data on same page). *.xbn script is for linking with -N flag (mix text and data on same page). Why are there five different linker scripts? Вот тут даются рекомендации по использованию своего скрипта AVR Libc Reference Manual Controlling the linker avr-ld. Там они предлагают заменить стандартный avr2.x на свой. Что я потом сделал. Я скопировал файл avr2.x в папку с проектом (там где Makefile, *.o, *.d), переименовал его в version_fw.x. Отредактировал его содержимое, добавив *(.text) KEEP(*(.text)) строчка 75 Потом в Atmel Studio main Properties -> Toolchain -> AVR/GNU Linker/Miscellaneous прописал -Wl,-T,-version_fw.x (или -version_fw). И при компилирование снова выдал ошибку: expected declaration specifiers or '...' before '*' token Прикрепил файл, расширение сменить на *.x version_fw.txt
  8. А какую секцию лучше использовать? Я кроме этих секций AVR GCC: секции памяти (что такое .text, .data, .bss, .noinit?) , других не знаю. И второй вопрос где и как отредактировать скрипт линкера или где можно прочитать про него? Так чтобы на доступном языке. Я с этими вещами первый раз столкнулся поэтому опыта в этом маловато.
  9. Теперь ругается на звездочку: expected declaration specifiers or '...' before '*' token
  10. Что то не получается у меня реализовать ваш пример. Где я ошибся??? const char name_fw[5] PROGMEM = "xxxx"; __attribute__ ((section (".init3"))); KEEP(*(".init3"));
  11. Вроде получилось. И получилось двумя способами: способ от Spider и от esaulenka. Единственное что общего у них, это что картинка флагов оптимизации (-Os) выглядела следующим образом -ffunction-sections (prepare functions for garbage collection) = SET -fdata-sections (prepare functions for data collection) = CLEAR (по умолчанию обычно SET) -fpack-struct (pack structure members together) = SET -fshort-enums (allocate only as many bytes needed by enaum types) = SET -mshort-calls (use rjamp/rcall (limited range) on > 8K devices) = CLEAR Поэтому, чтобы прописать версию прошивки (ПО) нужно было убрать флаг -fdata-sections и после инклудов написать: volatile const char fw_name[5] PROGMEM = "xxxx"; ИЛИ const char name_fw[5] PROGMEM = "xxxx"; __attribute__ ((used (name_fw))); Если есть еще какие замечания или комментарии с интересом выслушаю. Всем спасибо за помощь и советы. Esaulenka отдельное спасибо за ссылочку. Она еще мне пригодиться)
  12. Volatile не помогает, при оптимизации строчка выкидывается А на работающем никак не определить версию ПО. Этого и не нужно. Нужно после того как сняли модуль, прочитать микроконтроллер и с помощью hex-editor (XVI32) найти имя прошивки. Попробовал ваш вариант. Но ругается ошибкой " Error 1 unknown pseudo-op: `.db' ". Пишу в AtmelStudio 6.2 asm("Version: .DB DAY__,__MONTH__,__YEAR__,__HOUR__,__MINUTE__,__SECOND");
  13. Всем здравствуйте! Столкнулся с проблемой и никак не могу найти ее решение. Стоит задача прописывать в файле программы main.c имя версии. Я пробовал объявлять строку const char name_fw[] = "xxxx"; или const char name_fw[] PROGMEM = "xxxx"; Но при оптимизации эта строка вырезается т.к. в программе она нигде не используется. В итоге main.hex не содержит информации о версии ПО, и при считывании прошивки с микроконтроллера поди угадай какая версия туда была залита. Подскажите как можно решить эту проблему.
  14. В этом случае будет создан файл *.eep. Я так подозреваю Да есть, такое. Когда первый раз с этим столкнулся долго не мог понять что у меня где в eeprom
  15. Т.е все равно нужно использовать два файла для прошивки eeprom и flash?