-
- "Вона чё, Михалыч!"... Самые ужасные в нашем деле ошибки - синтаксические. Как Вам такой #definewaitcmd0x0025 - вход в автомат загрузчика. Лучше-бы я побухать куда-нть пошёл... - Точка опоры из дому(22.01.2012 14:47,
)
- А нубская книжка по Си есть, типа Фаронова про Паскаль? То, что у меня есть уже - про # и многое подразумевается мне известным и понятным. K&R скачанный с множеством орфографических ошибок неизвестно откуда как-то не сильно способствует. А я до Точка опоры из дому(248 знак., 21.01.2012 19:44,
)
- Давайте тогда конкретнее - что вы хотите, какой проц и что именно не получается. Тем более если ваш загрузчик собран тем же компилятором, то проблем вообще никаких - опишите прототипы функций в заголовочном файле как extern void Cepгeй Бopщ(215 знак., 21.01.2012 21:43 - 23:20)
- Нет, загрузчик собран из лучших инструкций, вручную, на ассемблере (AVR Studio). Расположен он в начале памяти программ - вот там я это описал ( Точка опоры из дому(602 знак., 21.01.2012 22:22,
)
- Извините, я принципиально не хожу на казус, даже из уважения к вам не пойду. Тащите код сюда или кидайте в мыло (см. профиль), постараюсь помочь. Нет там никаких подводный камней. - Сергей Борщ(23.01.2012 11:30)
- Ларчик просто открывался. Точка опоры(1291 знак., 23.01.2012 11:51)
- Все логично. Делал точно так же на меге8, когда надо было на определенные вектора прибить гвоздями свои обработчики из области загрузчика, отдав пользователю остальные. Сергей Борщ(596 знак., 23.01.2012 12:28 - 12:31)
- Такой изврат вынужденно плодится для PIC24. А уж в AVR то чего извращаться? Там и так все логично... - Гудвин(23.01.2012 12:12)
- Это tiny44, там нет выделенной секции. А Вы о чем? - Точка опоры(23.01.2012 12:19)
- Забыл уже, что есть и такие :) - Гудвин(23.01.2012 12:20)
- Это tiny44, там нет выделенной секции. А Вы о чем? - Точка опоры(23.01.2012 12:19)
- Ларчик просто открывался. Точка опоры(1291 знак., 23.01.2012 11:51)
- а на мысль не наводит что они не зря написали на ассемблере? lentjaj1(244 знак., 22.01.2012 10:21)
- Извините, я принципиально не хожу на казус, даже из уважения к вам не пойду. Тащите код сюда или кидайте в мыло (см. профиль), постараюсь помочь. Нет там никаких подводный камней. - Сергей Борщ(23.01.2012 11:30)
- Нет, загрузчик собран из лучших инструкций, вручную, на ассемблере (AVR Studio). Расположен он в начале памяти программ - вот там я это описал ( Точка опоры из дому(602 знак., 21.01.2012 22:22,
- Купи Страуструпа (С++). Он есть в любом книжном. - =SSN=(21.01.2012 19:59,
)
- Это из рубрики "вредные советы". Просто нужно добыть правильный K&R, лучше на языке оригинала. - SciFi(21.01.2012 20:26)
- Давайте тогда конкретнее - что вы хотите, какой проц и что именно не получается. Тем более если ваш загрузчик собран тем же компилятором, то проблем вообще никаких - опишите прототипы функций в заголовочном файле как extern void Cepгeй Бopщ(215 знак., 21.01.2012 21:43 - 23:20)
- На Си такое сделать нельзя, т.к. он придерживается стандартных соглашений о передаче параметров функций. Для таких задач пользуются ассемблером. Ксения(182 знак., 21.01.2012 15:26)
- Ксения, этого нельзя сделать на Си используя расширения имени ИАРа. Используя расширения gcc это сделать можно. - Cepгeй Бopщ(21.01.2012 15:30)
- Тогда это извращение, направленное на борьбу с языком, посредством компиляторных хитростей. Зачем делать через ухо, когда ассемблер как раз для таких вещей и существует? Ксения(121 знак., 21.01.2012 15:35 - 15:37)
- И ГЦЦ тоже позволяет. Несколько лет назад я это немного освоил и оно работало (для набития руки обработчики прерываний RTC и I2C былы на ассемблере). Если-бы загрузчик был частью приложения - наверное, я-бы смог вызывать его функции стандартными Точка опоры из дому(33 знак., 21.01.2012 19:16,
)
- Почему же? Для написания библиотеки это может иметь смысл: и сишный интерфейс, и оптимизация. В других случаях овчинка выделки не стоит, ИМХО. - SciFi(21.01.2012 15:43)
- Си (как и прочие языки относительно высокого уровня) используют тогда, когда знаешь алгоритм, но не хочешь детализировать его реализацию на уровне памяти и регистров, оставляя эту работу на усмотрение компилятора. А в данной задаче явно Ксения(149 знак., 21.01.2012 15:48)
- сдаётся мне, что автору уже дали правильный ответ lentjaj1(42 знак., 21.01.2012 15:45, ссылка)
- Нет, там использование регистров для передачи параметров отдано на откуп компилятору Си. В том примере нигде не сказано, в какие регистры нужно загружать параметры при входе в блок. - Ксения(21.01.2012 15:52)
- тот же пример на асме lentjaj1(294 знак., 21.01.2012 16:13, ссылка)
- Нет, там использование регистров для передачи параметров отдано на откуп компилятору Си. В том примере нигде не сказано, в какие регистры нужно загружать параметры при входе в блок. - Ксения(21.01.2012 15:52)
- И ГЦЦ тоже позволяет. Несколько лет назад я это немного освоил и оно работало (для набития руки обработчики прерываний RTC и I2C былы на ассемблере). Если-бы загрузчик был частью приложения - наверное, я-бы смог вызывать его функции стандартными Точка опоры из дому(33 знак., 21.01.2012 19:16,
- Тогда это извращение, направленное на борьбу с языком, посредством компиляторных хитростей. Зачем делать через ухо, когда ассемблер как раз для таких вещей и существует? Ксения(121 знак., 21.01.2012 15:35 - 15:37)
- Ксения, этого нельзя сделать на Си используя расширения имени ИАРа. Используя расширения gcc это сделать можно. - Cepгeй Бopщ(21.01.2012 15:30)
- GCC позволяет это сделать очень красиво и эффективно. Он позволяет объяснить компилятору, что функция принимает параметры в конкретных регистрах и в конкретных отдает, и компилятор строит код с учетом этого. Cepгeй Бopщ(1887 знак., 21.01.2012 15:15 - 15:26)
- Этот гадёныш (avr-gcc 3.4.6) таки считает себя умнее. А, ну и если функция не требует параметров или параметры передаются в соответствии с принятым в gcc соглашнеии о вызовах, то тогда в заголовочном файле пишем extern void Bootloader(); а в Точкa oпopы из дому(1029 знак., 08.02.2012 00:21,
)
- Как функция может начинаться с адреса 0x37, если команды двухбайтовые минимум? GCC считает адрес байтами, возможно надо было указать 0x006E? - Cepгeй Бopщ(08.02.2012 02:13)
- Да, и после -Ttext '=' не нужен? - Cepгeй Бopщ(08.02.2012 02:18)
- Этот гадёныш (avr-gcc 3.4.6) таки считает себя умнее (исправил форматирование). Toчкa oпopы(1740 знак., 08.02.2012 09:33 - 09:44)
- Этот RCALL PC+0001 - больше похоже на быстрое резервирование пары байтов на стеке. Далее: Cepгeй Бopщ(1411 знак., 08.02.2012 11:29 - 11:38)
- Этот гадёныш (avr-gcc 3.4.6) таки считает себя умнее (исправил форматирование). Toчкa oпopы(1740 знак., 08.02.2012 09:33 - 09:44)
- Да, и после -Ttext '=' не нужен? - Cepгeй Бopщ(08.02.2012 02:18)
- Как функция может начинаться с адреса 0x37, если команды двухбайтовые минимум? GCC считает адрес байтами, возможно надо было указать 0x006E? - Cepгeй Бopщ(08.02.2012 02:13)
- для ARM не надо так извращаться, по умолчанию компилятор для вызовов функций, параметры передает R0,R1,..., а результат ожидает в R0. - lentjaj1(21.01.2012 15:23)
- Эти "извращения" как раз на случай, когда надо не "по умолчанию". И кроме ARM есть еще другие процики. Если ABI совпадает - достаточно написать extern void myasmfunc(int a, int b); - Cepгeй Бopщ(21.01.2012 15:28)
- нам осталось догадаться на каком процессоре пишет автор. - lentjaj1(21.01.2012 15:30)
- Эти "извращения" как раз на случай, когда надо не "по умолчанию". И кроме ARM есть еще другие процики. Если ABI совпадает - достаточно написать extern void myasmfunc(int a, int b); - Cepгeй Бopщ(21.01.2012 15:28)
- Ужас какой. Это уже не Си, а псевдокод какой-то. Уж лучше на асме, так честнее. - SciFi(21.01.2012 15:17)
- +1! Тут уж надо определиться: либо Си, либо асм. - Bill(08.02.2012 07:03)
- Этот гадёныш (avr-gcc 3.4.6) таки считает себя умнее. А, ну и если функция не требует параметров или параметры передаются в соответствии с принятым в gcc соглашнеии о вызовах, то тогда в заголовочном файле пишем extern void Bootloader(); а в Точкa oпopы из дому(1029 знак., 08.02.2012 00:21,
- пару ссылок в помощь изучающему lentjaj1(358 знак., 21.01.2012 14:11)
- Если он использует стандартные соглашения о вызовах, то можно так AD(397 знак., 21.01.2012 13:59)
- А так ли уж нужно инлайнить? И почему "naked"? Своей-то, ассемблерной, стандартную обертку зачем не делать? - Скрипач(21.01.2012 13:13)
- "naked" - потому, что компилятору достаточно сгенерировать call по заданному адресу. Инлайн - потому, что naked. Третье предложение не понял. - Точка опоры из дому(21.01.2012 13:59,
)
- "naked" - потому, что компилятору достаточно сгенерировать call по заданному адресу. Инлайн - потому, что naked. Третье предложение не понял. - Точка опоры из дому(21.01.2012 13:59,
- *(volatile type *)address не проходит? - Vit(21.01.2012 12:40)
- Нет. Сыпет "error: stray '\NNN' in program". NNN - всякие 3-х разрядные числа. - Точка опоры из дому(21.01.2012 13:52,
)
- Нет. Сыпет "error: stray '\NNN' in program". NNN - всякие 3-х разрядные числа. - Точка опоры из дому(21.01.2012 13:52,
- "Вона чё, Михалыч!"... Самые ужасные в нашем деле ошибки - синтаксические. Как Вам такой #definewaitcmd0x0025 - вход в автомат загрузчика. Лучше-бы я побухать куда-нть пошёл... - Точка опоры из дому(22.01.2012 14:47,