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

В массиве только указатели на "команды". Команда представляет собой структуру. Разные команды - разные структуры. Одна занимает 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) и их значения задать Вам будет проще, чем мне гадать..

 

Алгоритм мой оценивать сложно так как вы видите очень малую часть общей картины.

Да, оценить, а точнее - понять Ваш алгоритм по этой малой части общей картины, действительно нельзя.. Но вот, заметить что алгоритм через чур сложный - можно.

Изменено пользователем defunct

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нашёл функцию "memcpy" скорее всего это сокращение от memcopy. С ней всё пашет. Спасибо.

 

Да, оценить, а точнее - понять Ваш алгоритм по этой малой части общей картины, действительно нельзя.. Но вот, заметить что алгоритм через чур сложный - можно.

 

Не спорю. Может даже ещё сложнее чем Вы подозреваете. :) Но с одной стороны - это решение поставленной задачи. А с другой - это МОЁ решение. :) Возможно пока я усложняю простые вещи. Или просто не вижу простого решения. Мой опыт программиста говорит, что ,как правило, находишь красивые решения, а потом их используешь многократно. Для этого, в первую очередь, требуется опыт. Я - оптимист, - опыт наработаем. :biggrin: Было бы желание и работоспособность.

 

За помощь премного благодарю. В последнее время задавать вопросы и даже просто посоветоваться было не с кем. Хорошо что есть инет! :) Так что не обижайтесь, я Вас ещё побеспокою.

 

Вопрос. Если я пишу п/п прерывания на asm, то необходимо как-то указывать компилятору С о наличии такой подпрограммы? Или это (что прерывание и расположено с такого вектора) указывается в модуле ASM и используется только линковщиком?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

/offtop

 

А всётаки что на счёт программы. Там 4 строчки. Описания переменных я дал. Смысл того что хочу сделать вроде объяснил. Где ошибка?

 

Нашёл функцию "memcpy" скорее всего это сокращение от memcopy. С ней всё пашет. Спасибо.

Как видите не всегда рационально искать ошибку там где ее можно обойти ;>

 

Вопрос. Если я пишу п/п прерывания на asm, то необходимо как-то указывать компилятору С о наличии такой подпрограммы? Или это (что прерывание и расположено с такого вектора) указывается в модуле ASM и используется только линковщиком?

Если в модуле с п/п на ассемблере указан ORG с адресом вектора прерывания, то безусловно это будет учтено на стадии линковки. Компилятору C главное не указывать директив #pragma vector с номером вектора который уже "занят" модулем на ASM.

Изменено пользователем defunct

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вопрос. Если я пишу п/п прерывания на asm, то необходимо как-то указывать компилятору С о наличии такой подпрограммы? Или это (что прерывание и расположено с такого вектора) указывается в модуле ASM и используется только линковщиком?

На C нужно разрешить указанное прерывание, установив соответствующие биты в регистрах, ответственных за прерывание, и глобально разрешив прерывания (__enable_interrupt() для IAR).

А на ассемблере - вот так, например (для IAR):

 

; Переход с вектора прерывания на процедуру обработки
; ISR (interrupt service routine)

    COMMON  INTVEC
    ORG     INT0_vect
    rjmp    ISR_Int0

; Процедура обработки прерывания

    RSEG    CODE

ISR_Int0:
; сохранение статуса и регистров при необходимости
; ...
; ...
; восстановление регистров и статуса

    reti

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как видите не всегда рационально искать ошибку там где ее можно обойти ;>

 

Когда "прикручивал" memcpy нашёл и там ошибку. :) Ошибка была моя и компилятор (оно и понятно) был не причём. Впрочем, вариант на memcpy работает быстрее почти в два раза. Поэтому оставил memcpy.

 

osnwt спасибо за пример.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А вот вопрос для понимания. Почему компилятор сохраняет регистры используя LD/ST -Y/Y+ а не PUSH/POP? Я вижу след. варианты ответов.

1) Чтобы контролировать переполнение

2) Чтобы удобнее было работать с переменными сохранёными в стеке (например в пп)

 

Может кто знает правильный ответ? Возможно это пригодится при работе asm/c.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Правильный ответ 2.

Индексной адресацией удобно бегать по списку аргументов.

Обратите внимание, когда регистр надо просто сохранить используется PUSH/POP

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Такой вот вопрос:

При входе в подпрограмму передаются два параметра. Они типа uint16_t. Но после определённых действий значимая их часть становится 8. И дальше для арифметических операций не требуется 16 бит. Как указать это компилятору? Чтобы результирующий код оптимальнее был? Можно конечно объявить локальные переменные и переприсвоить. Но вроде не очень красиво. Может возможно напрямую компилятору указать?

 

Ещё раз повторю вопрос старый. Как указать компилятору не инициализировать переменную __no_init у меня не работает. Может хедер какой нужно подключить?

 

Заранее благодарю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

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