Splinter 0 3 октября, 2007 Опубликовано 3 октября, 2007 · Жалоба Пишу свой первый проект для МК, учусь в процессе, осваиваю Си (CodeVisionAVR). Столкнулся с проблемой, решения которой немогу найти ни в книгах ни в примерах. Вот суть: пишу функцию для SPI (используется модуль USI в ATTyni26) на ассемблере, как передать параметры я разобрался а вот как вернуть результат этой функции никак ума не приложу. Вот код функции: char spi_transfer(char data) { #asm ld r16, y out 0xf, r16 ldi r16, (1<<USIWM0)+(0<<USICS0)+(1<<USITC) ldi r17, (1<<USIWM0)+(0<<USICS0)+(1<<USITC)+(1<<USICLK) out 0xd, r16 out 0xd, r17 out 0xd, r16 out 0xd, r17 out 0xd, r16 out 0xd, r17 out 0xd, r16 out 0xd, r17 out 0xd, r16 out 0xd, r17 out 0xd, r16 out 0xd, r17 out 0xd, r16 out 0xd, r17 out 0xd, r16 out 0xd, r17 in r16, 0xf #endasm return; } Как нужно реализовать return ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 123 3 октября, 2007 Опубликовано 3 октября, 2007 · Жалоба Как нужно реализовать return ?Читать в хелпе - там точно было, сам читал года 2 назад. В самом крайнем случае посмотреть исходники библиотек из комплекта компилятора - там множество функций, возвращающих значение. Вот только то, что вы привели нам в пример надо стараться писать на С. В противном случае вы связываете руки оптимизатору и получаете непортируемую на другие компиляторы программу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
drovik 0 3 октября, 2007 Опубликовано 3 октября, 2007 · Жалоба А библиотек для работы с SPI нет готовых ? Они уже оптимизированы должны быть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 123 3 октября, 2007 Опубликовано 3 октября, 2007 · Жалоба А библиотек для работы с SPI нет готовых ? Они уже оптимизированы должны быть.Какая, нах, библиотека????? Три строки кода - и уже библиотека нужна? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
drovik 0 3 октября, 2007 Опубликовано 3 октября, 2007 · Жалоба Ну вот эти 3 строки кода и вылезли в проблему... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yuri_d 0 3 октября, 2007 Опубликовано 3 октября, 2007 · Жалоба char spi_transfer(char data) { #asm [skip] #endasm return; } Как нужно реализовать return ? Функция, которую вы привели в примере написана не на ассемблере, а на С с ассемблерной вставкой. Ассемблерная функция пишется в отдельном файле по правилам для компилятора ассемблера. А у вас просто С функция, в которую вставили некоторое количество ассемблерных команд. Доступ к локальным переменным из ассемблерной вставки у разных компиляторов выглядит по разному. Посмотрите help. Скорее всего пройдет нечто похожее на LD REG, LOCAL_VAR для загрузки регистра и LD LOCAL_VAR, REG для сохранения результата ассемблерной вставки в локальную переменную. Далее достаточно просто выполнить return LOCAL_VAR. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sKWO 0 3 октября, 2007 Опубликовано 3 октября, 2007 (изменено) · Жалоба Пишу свой первый проект для МК, учусь в процессе, осваиваю Си (CodeVisionAVR). Столкнулся с проблемой, решения которой немогу найти ни в книгах ни в примерах. Вот суть: пишу функцию для SPI (используется модуль USI в ATTyni26) на ассемблере, как передать параметры я разобрался а вот как вернуть результат этой функции никак ума не приложу. посмотрите пример инициализации ЖКИ в библиотеке поставляемой вместе с CodeVision. там точно есть возврат параметра. и почитайте какие регистры использует компилятор и микшируйте осторожно. Изменено 3 октября, 2007 пользователем sKWO Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Splinter 0 4 октября, 2007 Опубликовано 4 октября, 2007 · Жалоба Функция, которую вы привели в примере написана не на ассемблере, а на С с ассемблерной вставкой. Ассемблерная функция пишется в отдельном файле по правилам для компилятора ассемблера. А у вас просто С функция, в которую вставили некоторое количество ассемблерных команд. Доступ к локальным переменным из ассемблерной вставки у разных компиляторов выглядит по разному. Посмотрите help. Скорее всего пройдет нечто похожее на LD REG, LOCAL_VAR для загрузки регистра и LD LOCAL_VAR, REG для сохранения результата ассемблерной вставки в локальную переменную. Далее достаточно просто выполнить return LOCAL_VAR. Спасибо за разъяснения. Посмотрел внимательнее Help и нашёл The functions return their values in the registers (from LSB to MSB): R30 for char and unsigned char R30, R31 for int and unsigned int R30, R31, R22, R23 for long and unsigned long. Ну вот эти 3 строки кода и вылезли в проблему... Вы неправы, это не проблема, а временная трудность с которой рано или поздно пришлось бы столкнуться. А если постоянно использовать готовые библиотеки то никогда и не научишься правильно и грамотно писать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться