defunct 0 23 марта, 2006 Опубликовано 23 марта, 2006 (изменено) · Жалоба В массиве только указатели на "команды". Команда представляет собой структуру. Разные команды - разные структуры. Одна занимает 14 байт, - другая - 150 байт. Друг в друга ни как не скопируешь. Сходу посоветовал бы включить в тело команды поле "размер команды" 1 байт. Чтобы избавиться от вычисления размера. Насчёт мемcopy посмотрю. Не видел такой функции. ну начните с такого прототипа: int CopyArray(char *dest, char *source, int count); копирует count байт из массива source в массив dest, возвращается число реально скопированных байт. Реализацию думаю Вы легко сможете написать.. а потом перейдите к такому (чтобы копировать что угодно и куда угодно): int CopyMemory(void *dest, void *source, int count); копирует count байт c адреса source по адресу dest, возвращается число реально скопированных байт. Имея реализацию первой функции, написать реализацию второй - по времени займет не больше одной минуты. А всётаки что на счёт программы. Там 4 строчки. Описания переменных я дал. Смысл того что хочу сделать вроде объяснил. Где ошибка? ошибка всплывет, если упростить выражение вида for(adrnpict=(AdrActiveKom);adrnpict<(AdrActiveKom[NumbActiveKom+1]-j);adrnpict++).... до такой записи: for(i=0; i<x; i++) { dest[i] = source[i]; } типы переменных (x, dest и source) и их значения задать Вам будет проще, чем мне гадать.. Алгоритм мой оценивать сложно так как вы видите очень малую часть общей картины. Да, оценить, а точнее - понять Ваш алгоритм по этой малой части общей картины, действительно нельзя.. Но вот, заметить что алгоритм через чур сложный - можно. Изменено 24 марта, 2006 пользователем defunct Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SapegoAL 0 24 марта, 2006 Опубликовано 24 марта, 2006 · Жалоба Нашёл функцию "memcpy" скорее всего это сокращение от memcopy. С ней всё пашет. Спасибо. Да, оценить, а точнее - понять Ваш алгоритм по этой малой части общей картины, действительно нельзя.. Но вот, заметить что алгоритм через чур сложный - можно. Не спорю. Может даже ещё сложнее чем Вы подозреваете. :) Но с одной стороны - это решение поставленной задачи. А с другой - это МОЁ решение. :) Возможно пока я усложняю простые вещи. Или просто не вижу простого решения. Мой опыт программиста говорит, что ,как правило, находишь красивые решения, а потом их используешь многократно. Для этого, в первую очередь, требуется опыт. Я - оптимист, - опыт наработаем. Было бы желание и работоспособность. За помощь премного благодарю. В последнее время задавать вопросы и даже просто посоветоваться было не с кем. Хорошо что есть инет! :) Так что не обижайтесь, я Вас ещё побеспокою. Вопрос. Если я пишу п/п прерывания на asm, то необходимо как-то указывать компилятору С о наличии такой подпрограммы? Или это (что прерывание и расположено с такого вектора) указывается в модуле ASM и используется только линковщиком? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
defunct 0 24 марта, 2006 Опубликовано 24 марта, 2006 (изменено) · Жалоба /offtop А всётаки что на счёт программы. Там 4 строчки. Описания переменных я дал. Смысл того что хочу сделать вроде объяснил. Где ошибка? Нашёл функцию "memcpy" скорее всего это сокращение от memcopy. С ней всё пашет. Спасибо. Как видите не всегда рационально искать ошибку там где ее можно обойти ;> Вопрос. Если я пишу п/п прерывания на asm, то необходимо как-то указывать компилятору С о наличии такой подпрограммы? Или это (что прерывание и расположено с такого вектора) указывается в модуле ASM и используется только линковщиком? Если в модуле с п/п на ассемблере указан ORG с адресом вектора прерывания, то безусловно это будет учтено на стадии линковки. Компилятору C главное не указывать директив #pragma vector с номером вектора который уже "занят" модулем на ASM. Изменено 24 марта, 2006 пользователем defunct Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
osnwt 0 25 марта, 2006 Опубликовано 25 марта, 2006 · Жалоба Вопрос. Если я пишу п/п прерывания на asm, то необходимо как-то указывать компилятору С о наличии такой подпрограммы? Или это (что прерывание и расположено с такого вектора) указывается в модуле ASM и используется только линковщиком? На C нужно разрешить указанное прерывание, установив соответствующие биты в регистрах, ответственных за прерывание, и глобально разрешив прерывания (__enable_interrupt() для IAR). А на ассемблере - вот так, например (для IAR): ; Переход с вектора прерывания на процедуру обработки ; ISR (interrupt service routine) COMMON INTVEC ORG INT0_vect rjmp ISR_Int0 ; Процедура обработки прерывания RSEG CODE ISR_Int0: ; сохранение статуса и регистров при необходимости ; ... ; ... ; восстановление регистров и статуса reti Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SapegoAL 0 25 марта, 2006 Опубликовано 25 марта, 2006 · Жалоба Как видите не всегда рационально искать ошибку там где ее можно обойти ;> Когда "прикручивал" memcpy нашёл и там ошибку. :) Ошибка была моя и компилятор (оно и понятно) был не причём. Впрочем, вариант на memcpy работает быстрее почти в два раза. Поэтому оставил memcpy. osnwt спасибо за пример. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SapegoAL 0 27 марта, 2006 Опубликовано 27 марта, 2006 · Жалоба А вот вопрос для понимания. Почему компилятор сохраняет регистры используя LD/ST -Y/Y+ а не PUSH/POP? Я вижу след. варианты ответов. 1) Чтобы контролировать переполнение 2) Чтобы удобнее было работать с переменными сохранёными в стеке (например в пп) Может кто знает правильный ответ? Возможно это пригодится при работе asm/c. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
beer_warrior 0 27 марта, 2006 Опубликовано 27 марта, 2006 · Жалоба Правильный ответ 2. Индексной адресацией удобно бегать по списку аргументов. Обратите внимание, когда регистр надо просто сохранить используется PUSH/POP Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SapegoAL 0 2 апреля, 2006 Опубликовано 2 апреля, 2006 · Жалоба Такой вот вопрос: При входе в подпрограмму передаются два параметра. Они типа uint16_t. Но после определённых действий значимая их часть становится 8. И дальше для арифметических операций не требуется 16 бит. Как указать это компилятору? Чтобы результирующий код оптимальнее был? Можно конечно объявить локальные переменные и переприсвоить. Но вроде не очень красиво. Может возможно напрямую компилятору указать? Ещё раз повторю вопрос старый. Как указать компилятору не инициализировать переменную __no_init у меня не работает. Может хедер какой нужно подключить? Заранее благодарю. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться