реклама на сайте
подробности

 
 
7 страниц V  « < 5 6 7  
Reply to this topicStart new topic
> Новичок на С, Помогите разобраться со структурой проекта
defunct
сообщение Mar 23 2006, 23:30
Сообщение #91


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(SasaVitebsk @ Mar 23 2006, 23:39) *
В массиве только указатели на "команды". Команда представляет собой структуру. Разные команды - разные структуры. Одна занимает 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[i]);adrnpict<(AdrActiveKom[NumbActiveKom+1]-j);adrnpict++).... до такой записи:

Код
for(i=0; i<x; i++)
{
  dest[i] = source[i];
}

типы переменных (x, dest и source) и их значения задать Вам будет проще, чем мне гадать..

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

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

Сообщение отредактировал defunct - Mar 24 2006, 01:51
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Mar 24 2006, 14:42
Сообщение #92


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



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

Цитата(defunct @ Mar 24 2006, 03:30) *
Да, оценить, а точнее - понять Ваш алгоритм по этой малой части общей картины, действительно нельзя.. Но вот, заметить что алгоритм через чур сложный - можно.


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

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

Вопрос. Если я пишу п/п прерывания на asm, то необходимо как-то указывать компилятору С о наличии такой подпрограммы? Или это (что прерывание и расположено с такого вектора) указывается в модуле ASM и используется только линковщиком?
Go to the top of the page
 
+Quote Post
defunct
сообщение Mar 24 2006, 15:42
Сообщение #93


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



/offtop

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


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

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

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

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

Сообщение отредактировал defunct - Mar 24 2006, 15:55
Go to the top of the page
 
+Quote Post
osnwt
сообщение Mar 25 2006, 07:08
Сообщение #94


Частый гость
**

Группа: Свой
Сообщений: 175
Регистрация: 26-01-06
Из: Sevastopol
Пользователь №: 13 664



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

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

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

    COMMON  INTVEC
    ORG     INT0_vect
    rjmp    ISR_Int0

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

    RSEG    CODE

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

    reti
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Mar 25 2006, 16:01
Сообщение #95


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(defunct @ Mar 24 2006, 19:42) *
Как видите не всегда рационально искать ошибку там где ее можно обойти ;>


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

osnwt спасибо за пример.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Mar 27 2006, 10:07
Сообщение #96


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



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

Может кто знает правильный ответ? Возможно это пригодится при работе asm/c.
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Mar 27 2006, 11:23
Сообщение #97


Профессионал
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



Правильный ответ 2.
Индексной адресацией удобно бегать по списку аргументов.
Обратите внимание, когда регистр надо просто сохранить используется PUSH/POP


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Apr 2 2006, 09:42
Сообщение #98


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



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

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

Заранее благодарю.
Go to the top of the page
 
+Quote Post

7 страниц V  « < 5 6 7
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 17:15
Рейтинг@Mail.ru


Страница сгенерированна за 0.01432 секунд с 7
ELECTRONIX ©2004-2016