Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Продукция MICROCHIP

Продукция MICROCHIP Технические вопросы по всей продукции Microchip

Ответ
 
Опции темы Опции просмотра
Старый 07.05.2008, 19:07   #1
Максим2008
Member
 
Регистрация: 14.01.2008
Адрес: Voronezh
Сообщений: 96
Вес репутации: 130/47
Максим2008 will become famous soon enoughМаксим2008 will become famous soon enough
По умолчанию указатели с ICD2 и без ICD2 ведут себя по-разному, где моя ошибка?

Господа программеры, если кто-нить сталкивался с такой проблемой как у меня, подскажите, где я нахомутал. Есть железка с двумя контроллерами на борту. Один из них является посредником и передает данные в ПК через USART. Работа его программы под дебагером ICD2 происходит нормально, но если просто прошить контроллер - работает совсем по-другому, не так как надо.

В основном модуле анализируется флаг удачного приема данных из другого контроллера и переброска из промежуточного буфера в буфер для отправки, потом отправка в USART:

Код:
main // основной модуль
 
uchar myframe[20]; // из другого контроллера
uchar buf_myframe[20]; // промежуточный
uchar send_myframe[20]; // отправка в ПК
 
uchar *myptr1 = myframe;
uchar *myptr2 = buf_myframe;
uchar *myptr3 = send_myframe;
 
........
 
// по получению флага удачного приема производим перекладку и отправку в ПК:
for (i = 0; i<20; i++)
 {
 *(myptr3+i) = *(myptr2+i);
 }
 serSendFrame(send_myframe, 20, 1); // отправка информации в USART в ПК
В дополнительном модуле помещен обмен с другим контроллером (поставщиком информации). При удачном приеме информация перекладывается из приемного буфера в промежуточный, и взводится флаг, что есть данные для отправки в ПК (тут он не указан):

Код:
dop.c // модуль, в котором производится прием из другого контроллера
 
extern uchar myframe[20];
extern uchar buf_myframe[20];
extern uchar send_myframe[20];
 
extern uchar *myptr1;
extern uchar *myptr2;
extern uchar *myptr3;
 
.........
 
// прием из другого контроллера в myframe
........
 
// после приема от другого контроллера - перекладываем в промежуточный:
for (j = 0; j<20; j++)
 {
 *(myptr2+j) = *(myptr1+j);
 }
Если работаю под ICD2, данные идут нормально (в ПК это видно), если без ICD2 - вижу в ПК нули. Похоже, я, будучи новичком, нахомутал с указателями. Если в основном модуле написать

Код:
serSendFrame(myframe, 20, 1);
то все работает не зависимо от ICD2. В чем же фокус?
Максим2008 вне форума   Ответить с цитированием
Старый 07.05.2008, 20:10   #2
Максим2008
Member
 
Регистрация: 14.01.2008
Адрес: Voronezh
Сообщений: 96
Вес репутации: 130/47
Максим2008 will become famous soon enoughМаксим2008 will become famous soon enough
По умолчанию Re: указатели с ICD2 и без ICD2 ведут себя по-разному, где моя ошибка?

А если так сделать:
Код:
main
...
 
for (i = 0; i<20; i++)
 {
 send_myframe[i] = buf_myframe[i];
 }
и
Код:
dop.c
...
 
for (j = 0; j<20; j++) 
 {
 buf_myframe[j] = myframe[j];
 }
то работает. Но почему с ICD2 вариант с указателями прокатывал, а без - нет? И чем этот вариант лучше?
Максим2008 вне форума   Ответить с цитированием
Старый 07.05.2008, 23:44   #3
Greg
Super Moderator
 
Регистрация: 25.02.2007
Адрес: Moscow, ODBS
Сообщений: 7,015
Вес репутации: 6060/179
Greg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond repute
По умолчанию Re: указатели с ICD2 и без ICD2 ведут себя по-разному, где моя ошибка?

Цитата:
Сообщение от Максим2008 Посмотреть сообщение
Код:
main // основной модуль
 
uchar myframe[20]; // из другого контроллера
uchar buf_myframe[20]; // промежуточный
uchar send_myframe[20]; // отправка в ПК
 
uchar *myptr1 = myframe;
uchar *myptr2 = buf_myframe;
uchar *myptr3 = send_myframe;
 
........
 
// по получению флага удачного приема производим перекладку и отправку в ПК:
for (i = 0; i<20; i++)
 {
 *(myptr3+i) = *(myptr2+i);
 }
 serSendFrame(send_myframe, 20, 1); // отправка информации в USART в ПК

то все работает не зависимо от ICD2. В чем же фокус?

как-то некрасиво вы с указателями
вместо
Код:
for (j = 0; j<20; j++)
 {
 *(myptr2+j) = *(myptr1+j);
 }
пишут
Код:
 for (j = 0; j<20; j++)
 {
 *myptr2++ = *myptr1++;
 }
потому что под это дело в железе процессоров даже делают специальный тип адресации - "косвенная с постинкрементом".
Если что - компилятор обычно это учитывает.

а ещё проще использовать функцию memcpy

типа
Код:
memcpy (myptr2, myptr1, 20);
или как там - попробуйте

при чём там ICD2 - хз, мало информации о вашем проекте

Последний раз редактировалось Greg; 08.05.2008 в 07:34.
Greg вне форума   Ответить с цитированием
Старый 08.05.2008, 07:58   #4
Greg
Super Moderator
 
Регистрация: 25.02.2007
Адрес: Moscow, ODBS
Сообщений: 7,015
Вес репутации: 6060/179
Greg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond repute
По умолчанию ещё

в конструкциях типа

Код:
 for (j = 0; j<20; j++)
 {
 *myptr2++ = *myptr1++;
 }
счётчик циклов обычно делают вниз со сравнением на 0.

Код:
j = 20;
do
 {
 *myptr2++ = *myptr1++;
 } while (--j);
в том же пике, например, в такой конструкции сработает инструкция decfsz
Greg вне форума   Ответить с цитированием
Старый 09.05.2008, 13:30   #5
Максим2008
Member
 
Регистрация: 14.01.2008
Адрес: Voronezh
Сообщений: 96
Вес репутации: 130/47
Максим2008 will become famous soon enoughМаксим2008 will become famous soon enough
По умолчанию Re: указатели с ICD2 и без ICD2 ведут себя по-разному, где моя ошибка?

Спасибо за советы! Жаль, что их приходится собирать по крупицам и нет источника в виде книги с объединением полезных советов а-ля "как ведет себя компилятор, если цикл инкрементный, а как - если декрементный". Явно Керниган не догадался предусмотреть в своей книге главу про пики и MCC18 .

Насчет ICD2, на что влияет директива DEBUG, может в ней дело, она у меня всегда OFF и я ее не менял при работе с дебагером.
Максим2008 вне форума   Ответить с цитированием
Старый 09.05.2008, 14:10   #6
Greg
Super Moderator
 
Регистрация: 25.02.2007
Адрес: Moscow, ODBS
Сообщений: 7,015
Вес репутации: 6060/179
Greg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond repute
По умолчанию Re: указатели с ICD2 и без ICD2 ведут себя по-разному, где моя ошибка?

Цитата:
Сообщение от Максим2008 Посмотреть сообщение
Спасибо за советы! Жаль, что их приходится собирать по крупицам и нет источника в виде книги с объединением полезных советов а-ля "как ведет себя компилятор, если цикл инкрементный, а как - если декрементный". Явно Керниган не догадался предусмотреть в своей книге главу про пики и MCC18 .
Вообще, чтобы хорошо писать на Си, надо очень чётко представлять систему команд и режимы адресации целевого процессора (достаточно просто _представлять_). И никакие особые книги не нужны.

Например, у того же мсп430 для указателей (в железе они проявляются как indirect addressing mode) вообще отсутствует автодекрементный режим, а автоИНкрементный существует только для источника данных.
Естественно, не стоит ожидать сверхэффективности кода от конструкций типа "*ptr--" и "*dst++ = src"

в вашем случае дело не в декрементном или инкрементном цикле, а в том, что вы не оставляли компилятору возможность выбора. В конструкции (*(ptr + J)) мог бы сработать т.н. индексный режим адресации (бывает и такой), гораздо менее эффективный, чем автоинкрементный. К сожалению у классического пика нет ни того, ни другого со всеми вытекающими. Зачастую самое оптимальное - довериться разработчикам компилятора с их встроенными фунциями типа memcpy и т.д.

Керниган плясал от небезывестной PDP-11, у которой с чем чем, а с режимами адресации всё было на высоте.


Цитата:
Сообщение от Максим2008 Посмотреть сообщение
Насчет ICD2, на что влияет директива DEBUG, может в ней дело, она у меня всегда OFF и я ее не менял при работе с дебагером.
вы вообще, как-то обозначаете в проекте, что используете ICD? ТАм обычно есть специальная галочка и дополнительно резервируется память и т.д.

Последний раз редактировалось Greg; 09.05.2008 в 14:17.
Greg вне форума   Ответить с цитированием
Старый 09.05.2008, 16:31   #7
Максим2008
Member
 
Регистрация: 14.01.2008
Адрес: Voronezh
Сообщений: 96
Вес репутации: 130/47
Максим2008 will become famous soon enoughМаксим2008 will become famous soon enough
По умолчанию Re: указатели с ICD2 и без ICD2 ведут себя по-разному, где моя ошибка?

Цитата:
Сообщение от Greg Посмотреть сообщение
вы вообще, как-то обозначаете в проекте, что используете ICD? ТАм обычно есть специальная галочка и дополнительно резервируется память и т.д.
Использую файл линкера с i в конце имени, в нем под дебагер отводится место. Ну еще "Allow ICD2 to select memories and ranges", но это уже непосредственно во вкладке дебагера. Вроде, в мплабе больше ничего такого... проекты веду еще с лета, пишу на основе созданной когда-то "рыбы", настроил раз и забыл. Все работало, просто в этот раз причина где-то в другом месте.
Максим2008 вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +3, время: 02:45.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd. Перевод: zCarot