имхо, чем меньше ассемблерных вставок, тем спокойнее жизнь программиста. вам действительно нельзя обойтись средствами Си? точно-точно? в таком случае рекомендовал бы просто сделать ассемблерный файл с нужными функциями - это намного проще.
odnk писал(а):При установленных уровнях оптимизации Q1,Q2,Q3,Qs не работают бесконечные циклы while(1),
for(;;), а также оператор безусловного перехода goto. На уровне Q0(без оптимизации)
таких проблем нет.
это все фантазии - все работает. очевидно, проблема у вас, как это водится, в том, что вы не до конца понимаете, что делаете. ну и/или volatile не используете, там, где это необходимо. обо всем на форуме писалось стопитцот раз - ищите поиском.
битва с дураками проиграна, победители торжествуют. слава победителям!
А как по вашему должен выглядеть бесконечный цикл на асме?
Читайте книжки вот пример из книги Керниган и Риччи (Brian W. Kernighan, Dennis M. Ritchie)
.
Спойлер3.5 Циклы while и for
Мы уже встречались с циклами while и for. В цикле
while (выражение)
инструкция
вычисляется выражение. Если его значение отлично от нуля, то выполняется инструкция, и вычисление выражения повторяется. Этот цикл продолжается до тех пор, пока выражение не станет равным нулю, после чего вычисления продолжатся с точки, расположенной сразу за инструкцией.
Инструкция for
for (выр1; выр2; выр3)
инструкция
эквивалентна конструкции
выр1;
while (выр2) {
инструкция
выр3;
}
если не считать отличий в поведении инструкции continue, речь о которой пойдет в параграфе 3.7.
С точки зрения грамматики три компоненты цикла for представляют собой произвольные выражения, но чаще выр1 и выр3 — это присваивания или вызовы функций, а выр2 - выражение отношения. Любое из этих трех выражений может отсутствовать, но точку с запятой опускать нельзя. При отсутствии выр1, или выр3 считается, что их просто нет в конструкции цикла; при отсутствии выр2, предполагается, что его значение как бы всегда истинно. Например,
for (;;) {
…
}
есть "бесконечный" цикл, выполнение которого,й вероятно, прерывается каким-то другим способом, например с помощью инструкций break или return.
IfoR писал(а):На что он мне вежливо отвечает:
Странно у меня вот это нормально компилируется.
Спойлер#include <avr/io.h>
#define buffersize2 5
int main(void){
Мастер Ломастер писал(а):имхо, чем меньше ассемблерных вставок, тем спокойнее жизнь программиста.
Обойтись то можно, но дело в том, что эта часть программы будет часто вызываться и нужно реализовать выполнение этой функции максимально быстрым. К тому же, реализовать эту часть на асм-е, как ни странно, проще, чем на Си (а в железе так вообще тупо проводочки подпаял и всё ).
IfoR писал(а):К тому же, реализовать эту часть на асм-е, как ни странно, проще, чем на Си
так я вам и посоветовал сделать файл *.s и в нем вашу функцию именно на ассемблере реализовать - не в виде вставки, а именно в виде ассемблера, где вы можете развернуться вовсю в своем умении писать на нем. вставка - костыль, я же посоветовал шагать без костылей.
битва с дураками проиграна, победители торжествуют. слава победителям!
vitalik_1984 писал(а):а это вы в компилированом варианте для своего кода берете?
Нет естественно, но разве после компиляции в моей вставке что-то должно поменяться?
Я сравнивал именно сам функциональный код. Мастер ломастер на счет костылей. У меня стандартный вопрос: с фига-ли это костыль (ну кроме синтаксиса, а то в таком случае весь Си для AVR один большой костыль)? И чем тогда не костыль вынесение функций в отдельный файл? И зачем мне вообще это здесь?
IfoR писал(а):Мастер ломастер на счет костылей. У меня стандартный вопрос: с фига-ли это костыль (ну кроме синтаксиса, а то в таком случае весь Си для AVR один большой костыль)? И чем тогда не костыль вынесение функций в отдельный файл? И зачем мне вообще это здесь?
я понимаю, что ваши вопросы скорее риторические, но тем не менее постараюсь ответить.
1. Си не костыль хотя бы по тому, что позволяет ускорить решение большинства задач, а не замедлить. если вы потратите 3 дня на попытку понять, что не так в вашей ассемблерной вствке и так и не продвинитесь в этом - то по-моему очевидно, что именно мешает вам двигаться... это костыль мешает, а не Си.
2. Создание ассемблерного исходника с нужными вам "особо скоростными" функциями это как раз нормальное решение проблемы (не костыль) ровно по той же самой причине: вы отлично знаете, как писать на ассемблере и не морочите себе голову над внедрением этого в сишный текст. нормальная практика, опять-таки, позволяющая максимально быстро двигаться к цели, а не ковылять.
3. а вот зачем все это вам - я не знаю, тут я пас.
битва с дураками проиграна, победители торжествуют. слава победителям!
Да, блин, о чем ты? Я же только спросил: что я делаю не так? Каким образом эта вставка может стать источником багов здесь? А может я хочу эту функцию inline-овой сделать или макросом. Зачем мне самому расставлять регистры, если компилятор сам их может расставить по месту.
Мастер Ломастер, вроде не маленький давно, старожил..
А предыдущее сообщение - полностью цитируешь..
Сам-же понимаешь, что читать темы с таким цитированием - крайне трудно..
МитяРа..
расставил? сутки уже прошли... речь не о багах, а о том, что силы тратятся непонятно на что - с ассемблерным модулем давно бы уже доделал весь проект, а не только его одну функцию. я вот не знаю, как там все эти параметры входные-выходные правильно задаются - и что-то не тянет узнавать. не вижу в этом смысла. извини, что на ты, и еще извини, что высказал свое мнение.
битва с дураками проиграна, победители торжествуют. слава победителям!
union uterm {
struct {
int top[5];
int bottom[5];
}term;
int arr[10];
};
union uterm TR; // structura v RAM
EEMEM union uterm TE; // structura v ROM
TR.term.top[0]=1;
TR.term.bottom[0]=2;
int my= eeprom_read_word(&TE.arr+i); // i= 0..9
До начала работы над проектом следует тщательно продумать все возможные ошибки и связи между ними.
Это значительно упростит работу над ошибками в самом проекте. (с)
Уважаемые, а не подскажете, есть ли в природе библиотеки к winavr, для перехода с codevisionavr?
Или нужно переписывать полностью код?
Я в avr не силен, но на языке C писал кроссплатформенные приложения под i386 FreeBSD и Linux. Codevisionavr мне не нравится, но есть исходник, написанный под него, судя по заголовочным файлам.
Т.е. я расчитываю на заголовочные файлы, которые можно подсунуть исходнику и он скомпилируется на avr-gcc
не получится скорее всего там в нем много примочек, неподвластных языку си , можно только скомпилить с самом CVAVR
А что конкретно хотели сделать? может получится спрятать свою брезгливость насчет Кодвижна и изменить то, что вам там хотелось?
Здравствуйте! пробую запустить таймер:
TCCR0 =(3<<CS0) ; // выдает ошибку:
error: 'CS0' undeclared (first use in this function)
error: (Each undeclared identifier is reported only once
Если же записать просто число:
TCCR0 =0x3; // работает как надо!
может что Подскажите...
slavik.ksu писал(а):Здравствуйте! пробую запустить таймер:
TCCR0 =(3<<CS0) ; // выдает ошибку:
error: 'CS0' undeclared (first use in this function)
error: (Each undeclared identifier is reported only once
Если же записать просто число:
TCCR0 =0x3; // работает как надо!
может что Подскажите...
#include <avr/io.h> вам поможет
только не понятно, что за экзотику вы пишите: (3 << CS0) ?! это вы тут что намерены получить? для выбора одного бита следует использовать макрос _BV() вот так: TCCR0 = _BV(CS0);
битва с дураками проиграна, победители торжествуют. слава победителям!
Мастер Ломастер писал(а):
#include <avr/io.h> вам поможет
только не понятно, что за экзотику вы пишите: (3 << CS0) ?! это вы тут что намерены получить? для выбора одного бита следует использовать макрос _BV() вот так: TCCR0 = _BV(CS0);
такой инклуд у меня уже есть.
CS0 там 3х битный. Записывая туда 3ку я получаю частоту работы таймера СК\64!
На Ваш вариант TCCR0 = _BV(CS0); тоже ругается.
И еще момент! Строчку:
TIMSK = 1<<OCIE0; // компилятор понимает!