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

Petka

Свой
  • Постов

    1 438
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные Petka


  1. все эти макросы и т.п. мне известны, но это совсем не то. что я хочу. я хочу писать программу, как пишут нормальные люди...

    Субботний оффтоп:

    Разделяю. Жаль, в некоторые микроконтроллеры недокладывают бит разрядности. Хорошо что появились микроконтроллеры, в которых разрядность адресов из коробки 32 бита и практически все виды памяти находятся в одном адресном пространстве - вот это для людей =)

  2. Не удалось достать 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 не имеет.

    Программой программатором или осциллографом.

  3. Не его (компилятора) собачье дело! :) Пускай warning выдаст, а я уж сам решу нужна мне там переменная или не нужна. Насчет выбрасывания неиспользуемых функций - согласен, а вот насчет выбрасывания переменных типа static ...ммм... можно привести реальные примеры такого поведения с указанием конкретных компиляторов и параметров оптимизации?

     

    static int foo;
    
    int main (void){
      return 0;
    }

     

    На любом ненулевом уровне оптимизации gcc выкидывает foo

  4. #include <avr/io.h>
    
    int main()
    {
    }
    
    void foo (void)
    {
      static int a;
      a = 2;
    
      return;
    }

    Даже в этой абсолютно бессмысленной программе он ее не выкидывает:

    ......

    И даже выполняет в нее запись. Оптимизация -Os

     

    Как хорошо, что вы не на месте компилятора! :)

    добавьте ключик "-ffunction-sections -fdata-sections -Wl,--gc-sections" и от вашей статической переменной абсолютно ничего не останется.

  5. Но в 8-разрядных процессорах это не так - int не может быть 8-битным, а выполнение операций в 16-разрядных переменных приводит к неэффективности кода.

    int может быть 8ми битным, для этого надо указать gcc правильный ключик.

    Другой пример - различные адресные пространства. Стандарт предназначен для машин фон-неймановской архитертуры и ничего не хочет знать о том, что указатель может указывать как на пространство кода, так и на пространство данных. А в кейле можно объявить указатель на нужное нам пространство и просто разыменовывать его *p безо всяких уродских pgm_read_byte и компилятор генерирует нужный код в зависимости от типа указателя.

    Это ещё одна причина использовать архитектуры где флэш и оперативная память адресуются одинаково без ущерба для производительности (ARM, например).

  6. Да, кейл тоже творчески подходит к стандарту и знает где можно от него отойти ради более эффективного кода. А гцц слишком тупо ему следует.

    Не бывает тупого следования стандарту.

     

    Бывает либо соответствие стандарту, либо несоответствие стандарту.

    Если компилятор не соответствует стандарту, то одинаковый код на разных платформах будет давать разный результат.

  7. Нет, это вы займетесь тиражированием. Если массив объявить 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

     

    как видим статическая переменная не попала бинарь так как не используется!

     

     

  8. ../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", но количество параметров и их размер (но не тип) совпадают, то компилятор ТАКИ линкует код (и снова делает варнинг). Это оказывается работоспособным. Такое поведение НИКАК не связано со способностью компилятора делать оптимизации. невключение заголовочников не уменьшит код ни на грамм.

  9. Результат сдвига вправо отрицательного числа по стандарту отдан на откуп компилятору. Почему они так решили - загадка.

    могу только дополнить кусочком из книги K&R:

    "...Сдвиг вправо числа со знаком в некоторых системах приводит к заполнению этих битов (прим: освободившихся) значением знакового бита ("арифметический сдвиг") , а в других - нулями ("логический сдвиг")..."

     

    P.S. Однако, в случае топикстартера всё равно логический или арифметический сдвиг был применён. результат будет одинаковым.

  10. Компилятор 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.

    Если это не так, то надо более точно разбираться.

  11. $  CFLAGS='-EL' ./configure --prefix=/home/akhromov/CodeSourcery/staging_dir --host=mipsel-linux-gnu

    попробуйте сначала так сконфигурировать и собрать zlib а только потом так же сконфигурировать и собрать libpng

  12. Спасибо за помощь

     

    Компилирую:

    $ 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=...."

  13. Компилирую 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)

    переконфигурируйте

  14. Затем компилирую 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 можете не выполнять.

    Попробуйте и сообщите результат.

  15. ...

    Если нужна помощь - я к Вашим услугам.

    В ближайшем времени постараюсь ещё раз обобщить результаты топика. БОльшая часть вопросов возникает из-за моей невозможности поправить первый пост в топике (и обновить там ссылки). Как раз Ваша помощь и понадобится.

  16. ...все прошивалось отлично(в 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.

×
×
  • Создать...