Petka
-
Постов
1 438 -
Зарегистрирован
-
Посещение
Сообщения, опубликованные Petka
-
-
Не удалось достать Mega8, есть только Mega64. WinAvr не хочет компилировать файл для Меги64 (мега8, мега48 без проблем). Буду очень благодарен за помощь, как что нужно прописать?
Извиняюсь за задержку с ответом.
В качестве Хака попробуйте в файл "uart.c" после всех include добавить строчку:
#define VAR_88CHIP
1) Какая минимальная частота SPI поддерживается?Официально 10 kHz
Если надо меньше - сделаем меньше.
2) Предусмотрен ли режим "долбежки" таргета?Не предусмотрен. Если очень надо, сделайте батник (три строчки всего), который в цикле будет считывать флэшку или сигнатуру чипа и смотрите спокойно сигналы.
3) Иногда программатор подвисает. Может быть, не этот :) Но при обращении к спящему (например, к "разово запрограммированному") МК может быть ситуация, когда ничего не остается делать, как отключать программатор и включать его снова. Не удобно. Можно ли его передернуть без этого?Вопрос не до конца понятен. Если всё дело в том что вы привыкли к зависающим программаторам - этот не из таких.
Если вопрос в том можно ли заресетить микроконтроллер в программаторе? На плате выведен ресет контроллера на точку для пайки - припаяйте туда кнопку и перезагружайте контроллер когда понадобится.
Ну, и обычный вопрос перед началом действий: так таки схема, опубликованная на первой странице той эпической ветки - актуальна? Лучше ее у автора нет?Схема и печатные платы не менялись всё что я выкладывал - актуально. (только надо выбрать какая разпиновка вам больше подойдёт)
Спасибо!На здоровье.
...(выставил галочки в PonyProg в окошках SUT1,BODLEVEL2,BODLEVEL1). Прав ли я в этом выборе?Фузы вроде правильно.
Сам прошивается без проблем.При подключении мигает 6 раз, подключаю к программируемому чипу, диод загорается.отлично.
но программы его не видят.Какие программы?
С какими параметрами?
Пробовали avrdude?
Как его можно еще проверить ведь функции поддержки терминала 48 mega не имеет.Программой программатором или осциллографом.
-
...
Все ядра, так или иначе, "проприетарные". Опен-сорцов, кажись, не было.
...
SPARC - opensource
-
Не его (компилятора) собачье дело! :) Пускай warning выдаст, а я уж сам решу нужна мне там переменная или не нужна. Насчет выбрасывания неиспользуемых функций - согласен, а вот насчет выбрасывания переменных типа static ...ммм... можно привести реальные примеры такого поведения с указанием конкретных компиляторов и параметров оптимизации?
static int foo; int main (void){ return 0; }
На любом ненулевом уровне оптимизации gcc выкидывает foo
-
#include <avr/io.h> int main() { } void foo (void) { static int a; a = 2; return; }
Даже в этой абсолютно бессмысленной программе он ее не выкидывает:
......
И даже выполняет в нее запись. Оптимизация -Os
Как хорошо, что вы не на месте компилятора! :)
добавьте ключик "-ffunction-sections -fdata-sections -Wl,--gc-sections" и от вашей статической переменной абсолютно ничего не останется.
-
...
Для того, чтобы повесить 1Mhz на 23 ногу меги8 (РС0) нужно изменить Led.h вот так?
...
Нет.
нужно править main.c
// 1Mhz out #define OUT_1MHZ_PORT C #define OUT_1MHZ_PIN 0 #define OUT_1MHZ_ALEV H
-
И что, от этого компилятор будет генерировать вычисление выражений по-другому? Будет приводить к 8-битному int?
да.
-
Но в 8-разрядных процессорах это не так - int не может быть 8-битным, а выполнение операций в 16-разрядных переменных приводит к неэффективности кода.
int может быть 8ми битным, для этого надо указать gcc правильный ключик.
Другой пример - различные адресные пространства. Стандарт предназначен для машин фон-неймановской архитертуры и ничего не хочет знать о том, что указатель может указывать как на пространство кода, так и на пространство данных. А в кейле можно объявить указатель на нужное нам пространство и просто разыменовывать его *p безо всяких уродских pgm_read_byte и компилятор генерирует нужный код в зависимости от типа указателя.Это ещё одна причина использовать архитектуры где флэш и оперативная память адресуются одинаково без ущерба для производительности (ARM, например).
-
Да, кейл тоже творчески подходит к стандарту и знает где можно от него отойти ради более эффективного кода. А гцц слишком тупо ему следует.
Не бывает тупого следования стандарту.
Бывает либо соответствие стандарту, либо несоответствие стандарту.
Если компилятор не соответствует стандарту, то одинаковый код на разных платформах будет давать разный результат.
-
Нет, это вы займетесь тиражированием. Если массив объявить static и поместить в h-файл, то в каждом c-файле будет экземпляр этого массива! Чтобы он был один, он должен находиться в одном c-файле (без static), а в остальных c-файлах (или в h-файле который в них включаются) он должен быть объявлен как extern. Я не знаю, ну это же азы.
Это заблуждение.
Если статическая переменная не используется в коде, то она выкидывается оптимизатором при уровне оптимизации большем чем -00.
пример:
// test.c static int something; // проверим, попадёт ли эта переменная в запускаемый файл #include <stdio.h> int main(void){ printf("test\n"); return 0; }
gcc -o test.out test.c
смотрим что попало в бинарь:
> nm test.out 08049f20 d _DYNAMIC 08049ff4 d _GLOBAL_OFFSET_TABLE_ 080484bc R _IO_stdin_used w _Jv_RegisterClasses 08049f10 d __CTOR_END__ 08049f0c d __CTOR_LIST__ 08049f18 D __DTOR_END__ 08049f14 d __DTOR_LIST__ 080484c4 r __FRAME_END__ 08049f1c d __JCR_END__ 08049f1c d __JCR_LIST__ 0804a014 A __bss_start 0804a00c D __data_start 08048470 t __do_global_ctors_aux 08048360 t __do_global_dtors_aux 0804a010 D __dso_handle w __gmon_start__ 0804846a T __i686.get_pc_thunk.bx 08049f0c d __init_array_end 08049f0c d __init_array_start 08048400 T __libc_csu_fini 08048410 T __libc_csu_init U __libc_start_main@@GLIBC_2.0 0804a014 A _edata 0804a020 A _end 0804849c T _fini 080484b8 R _fp_hw 080482b8 T _init 08048330 T _start 0804a014 b completed.7021 0804a00c W data_start 0804a018 b dtor_idx.7023 080483c0 t frame_dummy 080483e4 T main U puts@@GLIBC_2.0 0804a01c b something
теперь включаем минимальную оптимизацию:
gcc -o test.out -O1 test.c
смотрим что попало в бинарь:
> nm test.out 08049f20 d _DYNAMIC 08049ff4 d _GLOBAL_OFFSET_TABLE_ 080484ec R _IO_stdin_used w _Jv_RegisterClasses 08049f10 d __CTOR_END__ 08049f0c d __CTOR_LIST__ 08049f18 D __DTOR_END__ 08049f14 d __DTOR_LIST__ 080484f4 r __FRAME_END__ 08049f1c d __JCR_END__ 08049f1c d __JCR_LIST__ 0804a014 A __bss_start 0804a00c D __data_start 080484a0 t __do_global_ctors_aux 08048380 t __do_global_dtors_aux 0804a010 D __dso_handle w __gmon_start__ 0804849a T __i686.get_pc_thunk.bx 08049f0c d __init_array_end 08049f0c d __init_array_start 08048430 T __libc_csu_fini 08048440 T __libc_csu_init U __libc_start_main@@GLIBC_2.0 U __printf_chk@@GLIBC_2.3.4 0804a014 A _edata 0804a01c A _end 080484cc T _fini 080484e8 R _fp_hw 080482dc T _init 08048350 T _start 0804a014 b completed.7021 0804a00c W data_start 0804a018 b dtor_idx.7023 080483e0 t frame_dummy 08048404 T main
как видим статическая переменная не попала бинарь так как не используется!
-
../utils.c:47: warning: implicit declaration of function 'memset'
../utils.c:47: warning: incompatible implicit declaration of built-in function 'memset'
...
Почему, что сотворил компилятор?
gcc когда встречает использование функции, которая не была объявлена расценивает это как объявление функции (о чём и говорит варнинг "implicit declaration of function 'memset'")
когда на стадии линковки выясняется, что фактическое определение функции не совпадает с "implicit declaration", но количество параметров и их размер (но не тип) совпадают, то компилятор ТАКИ линкует код (и снова делает варнинг). Это оказывается работоспособным. Такое поведение НИКАК не связано со способностью компилятора делать оптимизации. невключение заголовочников не уменьшит код ни на грамм.
-
Результат сдвига вправо отрицательного числа по стандарту отдан на откуп компилятору. Почему они так решили - загадка.
могу только дополнить кусочком из книги K&R:
"...Сдвиг вправо числа со знаком в некоторых системах приводит к заполнению этих битов (прим: освободившихся) значением знакового бита ("арифметический сдвиг") , а в других - нулями ("логический сдвиг")..."
P.S. Однако, в случае топикстартера всё равно логический или арифметический сдвиг был применён. результат будет одинаковым.
-
Просто мы же в разделе AVR, мне казалось что особо указывать что есть PIND не нужно. Хотя (*(volatile uint8_t *)(mem_addr)) я не нашёл - оно где?
include/avr/sfr_defs.h
-
#define PIND _SFR_IO8(0x09)
Если совсем правильно, то
(*(volatile uint8_t *)(mem_addr))
где mem_addr это адрес порта D
таким образом PIND это uint8_t т.е. ровно 8 битное беззнаковое число.
-
Вот я и пытаюсь добиться определения PIND в WinAVR ибо "Он не мой - это регистр ввода с порта." это не определение на языке C. Отсюда и плясать надо.
#define PIND _SFR_IO8(0x09)
-
Компилятор WinAVR-20090313
Неужели ((~PIND) >> 4) и (~(PIND >> 4)) должны давать одинаковый результат?
PIND у меня равен 0b1110????
~(PIND >> 4) получается 0b11110001 как и должно быть.
(~PIND) >> 4 получается тоже 0b11110001, хотя мне кажется должно быть 0b00000001
Я ошибаюсь?
Разбираем по шагам:
PIND = 0b1110**** (PIND это 8 битное число)
результат инвертирования (почему смотри ниже) будет иметь тип int (в avr-gcc тип int это знаковое 16 битное число). поэтому 8 битное беззнаковое число будет расширено до знакового 16 битного
~PIND == ~(0b00000000 1110****) == 0b11111111 0001***
(~PIND) >> 4 с правой стороны этого выражения числовая константа (без явного указания типа), а по стандарту си она должна интерпретироваться как тип int. При операции сдвига меньший операнд по стандарту си должен быть расширен до бОльшего (именно по этой причине компилятор делал инвертирование в 16 битах). т.е. имеем: (~PIND) >> 4 == 0b11111111 0001**** >> 4 == 0b11111111 11110001
итого, если результат приводится к 8ми битному типу то должно получиться 0b11110001.
Если это не так, то надо более точно разбираться.
-
Я так и сделал. Обе библиотеки с флагами "CFLAGS='-EL' CXXFLAGS='-EL'"пересобрал
Всё заработало?
-
$ CFLAGS='-EL' ./configure --prefix=/home/akhromov/CodeSourcery/staging_dir --host=mipsel-linux-gnu
попробуйте сначала так сконфигурировать и собрать zlib а только потом так же сконфигурировать и собрать libpng
-
Спасибо за помощь
Компилирую:
$ mips-linux-gnu-gcc -o hello hello.c $ mips-linux-gnu-gcc -EL -march=74kc -fPIC -o hello1 hello.c
Определите какой именно из 3х ключей нужен для запуска?
1) -EL
2) -march=74kc
3) -fPIC
P.S.
-EL это "Endian Little"
Вероятно это единственный ключ, который надо добавить в CFLAGS при конфигурации библиотек. Попробуйте. "CFLAGS = -EL ./configure --prefix=.... --host=...."
-
Компилирую zlib.
# Установил окружение
$ export PATH=$HOME/CodeSourcery/Sourcery_G++_Lite/bin:$PATH
$ export CFLAGS='-EL -march=74kc -fPIC'
$ export CXXFLAGS='-EL -march=74kc -fPIC'
cd ~/Stuff
wget http://zlib.net/zlib-1.2.4.tar.gz
tar xvzf zlib-1.2.4.tar.gz
cd zlib-1.2.4
CC=mips-linux-gnu-gcc AR=mips-linux-gnu-ar RANLIB=mips-linux-gnu-ranlib ./configure --prefix=/home/akhromov/CodeSourcery/staging_dir
Аналогично export ы не нужны (кроме path)
переконфигурируйте
-
Затем компилирую libpng-1.4.1
...
В чем может быть проблема?
libpng уже обновился до версии 1.4.4 вряд ли в этом дело, но опробуйте обновиться.
Затем компилирую libpng-1.4.1$ cd ~/Stuff $ wget ftp://ftp.simplesystems.org/pub/libpng/png/src/libpng-1.4.1.tar.gz $ tar xvzf libpng-1.4.1.tar.gz $ cd libpng-1.4.1 $ export LDFLAGS="-L /home/akhromov/CodeSourcery/staging_dir/lib" $ export CPPFLAGS="-I /home/akhromov/CodeSourcery/staging_dir/include" $ ./configure --prefix=/home/akhromov/CodeSourcery/staging_dir --host=mips-linux-gnu $ make
1) Вы пробел сами оставили перед L (см выше)
2) Строчки начинающиеся с EXPORT можете не выполнять.
Попробуйте и сообщите результат.
-
...
Если нужна помощь - я к Вашим услугам.
В ближайшем времени постараюсь ещё раз обобщить результаты топика. БОльшая часть вопросов возникает из-за моей невозможности поправить первый пост в топике (и обновить там ссылки). Как раз Ваша помощь и понадобится.
-
...все прошивалось отлично(в AVR Studio ver 4.17.666) пока в программе не написал строчку которая подтягивает PB2(SCK) к Vcc
PORTB |= (1<<(2));
Эта строчка по идее никак не должна сказывться на возможность программирования. Т.к. процедура входа в режим программирования начинается с подачи ресета на контроллер. При ресете все пины контроллер переводит в высокоимпедансное состояние. Причина может быть косвенной, например при включении цепи "DRIVER" запускается нагрузка, которая просаживает питание или создаёт помехи, которые сбивают процесс программирования. Попробуйте в схеме убрать конденсатор с цепи ресета или добавьте параллельно резистору R7 диод (катодом к VCC).
После прошивания, контролер не доступен с AVR StudioОстальные пины PB0(MOSI) PB1(MISO) подтянуты к VCC.
Достучаться смог с CodeVision стер кристал,все стало работать.
Попробуйте ещё для программирования программу avrdude.
Это косяк студии, или программатора?Пробывал залить последнию версию прошивки ver7 таже ситуация.
Если программатор программирует с другой управляющей программой, значит дело не в программаторе.
Попробуйте в студии в настройках программирования понизить частоту ISP.
-
И всего 100 мегабит? Или у Вас в предыдущем посте опечатка? Спасибо за ответ.
Физика использовалась 100 мегабитная (не стоит задачи использовать гигабитку)
-
Это очень интересно - я давно пытаюсь узнать сетевую производительность MPC под Линуксом.
Какой именно MPC - модель и частота?
MPC8314@400Mhz
AVR-GCC: указатель для адресного пространства более 64К
в GNU/OpenSource средства разработки
Опубликовано · Пожаловаться
Субботний оффтоп:
Разделяю. Жаль, в некоторые микроконтроллеры недокладывают бит разрядности. Хорошо что появились микроконтроллеры, в которых разрядность адресов из коробки 32 бита и практически все виды памяти находятся в одном адресном пространстве - вот это для людей =)