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

|
Доброго времени суток. Помогите начинающему. Долгое время писал на асме для разных микропроцессоров. В том числе большие проекты. На IBM приходилось писать вспомогательные програмки на Delfi. "C" использовать не приходилось. В данный момент приходится осваивать для реализации крупного и длительного проекта. "С" так, как есть вариант впоследствии перейти на др. МП. Почитал, - синтаксис языка вполне понятен. Хоть сейчас в бой. Но нек. моменты не понятны. Во-первых, не хочу обидеть чьи-нибудь чувства, но более дебильной и запутанной IDE среды чем IAR Wb я не встречал. Но к этому привыкну. Скачал PDFы и сделал книжечки. По возможности изучил. Сделал маленькую прогу, но всё равно остался ряд вопросов по организации проги. 1) Как определять какие библиотеки включать? 2) Если необходимы прерывания достаточно ли такого объявления или необходимо что-то ещё (например переходы): #pragma vector=USART_RXC_vect __interrupt void rxint(void) { } 3) Как понимать следующие строки? (В смысле на языке высокого уровня) jmp_buf main_task; jmp_buf iprx_task; jmp_buf iptx_task; char iprx_rstack[8]; и вот эти пжлст #pragma vector=USART_RXC_vect __interrupt void rxint(void) { if (!setjmp(main_task)) //Запомнили контекст осн. задачи { longjmp(iprx_task,1); //Перешли в контекст IPrecive } } 4) Что необходимо описывать чтобы грамотно сделать проект в котором несколько файлов ".С" 5) При использовании кольцевого буфера правильнее открыть буфер в виде массива или использовать указатели. 6) Профи, если можно вышлите какой-нибудь файл(ы) исходников (можно не рабочих, урезанных или с ошибками) по которым я мог бы посмотреть структуру программы. Лучше с прерываниями. Обязуюсь не распространять и использовать в качестве учебных. Пожалуйста не присылайте слишком больших, а то я зароюсь.  Заранее благодарен. e-mail: sasa@c32dvina.com
|
|
|
|
|
 |
Ответов
(30 - 44)
|
Mar 1 2006, 14:04
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(SasaVitebsk @ Mar 1 2006, 17:07)  Теперь новый вопрос. Если Вы не возражаете. Я хочу во флеш разместить несколько массивов. И масив указателей на эти массивы. Вот такое объявление будет правильным? Если нет, то как?
const byte __flash fnt0_6x8[224] = { .... }; const byte __flash fnt1_8x8[224] = { .... }; const word __flash fnt3_10x10[224] = { .... }; const word __flash fnt3_11x13[224] = { .... };
const void __flash *symbol[3] = {&fnt0_6x8,&fnt1_8x8,&fnt2_10x10,&fnt3_11x13}; Во-первых, const не нужен - __flash и так константнее некуда.  Я обычно использовал вид __flash byte Array[] = { .... }; Оператор разименовывания ('*') при объявлении массива писать не надо, если только не хотите объявить массив указателей. Вообще, я понял, что Вам надо типа двумерного массива - ну так и объявите явно массив массивов, зачем эти финты с адресами? И памяти меньше скушает.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Mar 1 2006, 18:33
|

Шаман
     
Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221

|
Цитата(defunct @ Mar 1 2006, 20:26)  Цитата(dxp @ Mar 1 2006, 16:04)  Во-первых, const не нужен - __flash и так константнее некуда.  Я обычно использовал вид А почему в таком случае нельзя просто const использовать, все-таки const это из стандарта ansi-c, а __flesh всего-лишь приблуда от IAR. В этом случае компилятор\линкер могут потребовать внешней ROM, где и будут храниться Ваши константы. Что касается стандартов, то они хороши для PC, а для embedded приложений с невероятным количеством особенностей целевых архитектур "приблуды" зачастую необходимы.
|
|
|
|
|
Mar 2 2006, 18:13
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(dxp @ Mar 1 2006, 18:04)  Во-первых, const не нужен - __flash и так константнее некуда.  Я обычно использовал вид __flash byte Array[] = { .... }; Оператор разименовывания ('*') при объявлении массива писать не надо, если только не хотите объявить массив указателей. Вообще, я понял, что Вам надо типа двумерного массива - ну так и объявите явно массив массивов, зачем эти финты с адресами? И памяти меньше скушает. Спецы как всегда зрят в корень!  Их не обманешь. Уточню картину.  С учётом Ваших поправок. byte __flash fnt0_6x8[224][8] = { .... }; byte __flash fnt1_8x8[224][8] = { .... }; word __flash fnt3_10x10[224][10] = { .... }; word __flash fnt3_11x13[224][13] = { .... }; void __flash *symbol[3] = {&fnt0_6x8,&fnt1_8x8,&fnt2_10x10,&fnt3_11x13}; Я действительно хотел сделать массив ссылок, потому как масивы во первых два байтовых и два словных, а во вторых имеют разные размеры. Я не знаю как их объединить в один массив обычный. Во вторых если я хотел сделать массив указателей правильно ли я объявил их ( &...) . Компилятор не выдал мне ошибки И ещё отдельный вопрос. При запуске мой компилятор указывает мне на отсутствие одного из файлов DLL. И ещё ряд вопросов у меня к нему  Где скачать?
|
|
|
|
|
Mar 2 2006, 18:19
|
Знающий
   
Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32

|
Цитата Во вторых если я хотел сделать массив указателей правильно ли я объявил их ( &...) . Компилятор не выдал мне ошибки Уже писал про это на прошлой странице.
--------------------
Главная линия этого опуса ясна мне насквозь!
|
|
|
|
|
Mar 2 2006, 20:48
|
Участник

Группа: Свой
Сообщений: 41
Регистрация: 16-02-05
Пользователь №: 2 688

|
Цитата(SasaVitebsk @ Mar 2 2006, 20:13)  void __flash *symbol[3] = {&fnt0_6x8,&fnt1_8x8,&fnt2_10x10,&fnt3_11x13}; в левой части надобы ставиить 4, т.к. кол-во элементов массива = 4.
|
|
|
|
|
Mar 3 2006, 05:30
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(IgorKossak @ Mar 2 2006, 00:33)  Цитата(defunct @ Mar 1 2006, 20:26)  Цитата(dxp @ Mar 1 2006, 16:04)  Во-первых, const не нужен - __flash и так константнее некуда.  Я обычно использовал вид А почему в таком случае нельзя просто const использовать, все-таки const это из стандарта ansi-c, а __flesh всего-лишь приблуда от IAR. В этом случае компилятор\линкер могут потребовать внешней ROM, где и будут храниться Ваши константы. Добавлю: либо разместит объекты, объявленные как const, в ОЗУ. А его мало и жалко его тратить под неизменяемые данные.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Mar 3 2006, 05:43
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(SasaVitebsk @ Mar 3 2006, 00:13)  byte __flash fnt0_6x8[224][8] = { .... }; byte __flash fnt1_8x8[224][8] = { .... }; word __flash fnt3_10x10[224][10] = { .... }; word __flash fnt3_11x13[224][13] = { .... };
void __flash *symbol[3] = {&fnt0_6x8,&fnt1_8x8,&fnt2_10x10,&fnt3_11x13};
Я действительно хотел сделать массив ссылок, потому как масивы во первых два байтовых и два словных, а во вторых имеют разные размеры. Я не знаю как их объединить в один массив обычный. Во вторых если я хотел сделать массив указателей правильно ли я объявил их ( &...) . Компилятор не выдал мне ошибки Если массивы имеют разные размеры, то сделать их элементами массива не получится. Массив - это агрегатный тип, состоящий из элементов одинкового типа. Такие массивы можно сложить в структуру, т.к. структура - это агрегатный тип, который может содержать элементы разных типов. Правда, структура не имеет полезного свойства массивов - возможности обращения по индексу. Сделать массив указателей на разные типы тоже нельзя, указатели на разные типы - сами по себе являются разными типами и не могут быть элементами массива. То, что Вы сделали - завели массив указателй void* - это Вы обманули компилятор (и себя тоже  ). Этим самым Вы отключили контроль типов со стороны компилятора и взяли всю ответственность за правильность работы на себя. Компилятор тут "умыл руки". Не советую так делать. Вообще, найдется очень немного случаев, когда без void* действительно сложно обойтись и он оправдан. Но рассматриваемый случай совсем не этот. Я не очень понимаю, что Вы хотите иметь в конечном итоге, но учитывая, что эти массивы как-то используются в каких-то функциях, и принимая во внимание тот факт, что раз массивы разные, то и функции с ними работают разные, - реализовать работу с ними через массив указателей на функции. Цитата(SasaVitebsk @ Mar 3 2006, 00:13)  И ещё отдельный вопрос. При запуске мой компилятор указывает мне на отсутствие одного из файлов DLL. И ещё ряд вопросов у меня к нему  Где скачать? На какую DLL? Никогда ничего подобного не встречал.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Mar 3 2006, 11:10
|
Участник

Группа: Свой
Сообщений: 22
Регистрация: 9-12-04
Пользователь №: 1 425

|
Сообщение об отсутствии nwtdavr.dll наблюдал в результате "лечения" IAR версии 3.20 под XP. Появляется при каждый раз при старте компилятора. По моим наблюдениям на работоспособность не влияет.
|
|
|
|
|
Mar 5 2006, 16:22
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(SasaVitebsk @ Feb 14 2006, 23:40)  Цитата(vet @ Feb 14 2006, 10:28)  2) Это пишется так: tip1->TimeLife--;
Это как раз понятно. А объявление я правильно сделал или правильнее как в коментарии? Компилятор при таком объявлении займёт память или нет и как это посмотреть? Передаю привет "vet". Даже если он этот топик и не увидит. Вот теперь не то чтобы понятно, но чуть-чуть приблизился к пониманию. А ведь знающие люди месяц назад писали. Вот баран самоуверенный. Теперь более 500 строк текста перелопачиваю!  Ещё вопрос. Хочу в подпрограмму передать ссылку. Это массив расположенный в структуре. На неё имеется указатель. Т.е. к самому массиву я обращаюсь KomG->Pict, а адрес пытаюсь передать типа &(KomG->Pict). Объявление следующее: struct AddrKomG { byte Name; // Èìÿ êîìàíäû word TimeStart; // Âðåìÿ íà÷àëà èñïîëíåíèÿ êîìàíäû byte TimeMashtabTek, // Òåêóùåå çíà÷åíèå ìàñøòàáà äëÿ âðåìåíè èñïîëíåíèÿ TimeMashtab; // Ìàñøòàá äëÿ âðåìåíè èñïîëíåíèÿ word TimeLife; // Âðåìÿ èñïîëíåíèÿ êîìàíäû ñ ó÷¸òîì ìàñøòàáà int BegX,BegY; // Íà÷àëî îáúåêòà (X,Y) signed char VecX,VecY; // âåêòîð ïåðåìåùåíèÿ îáúåêòà (X,Y) word SizeX,SizeY; // Ðàçìåð êàðòèíêè (X,Y) byte Pict[10]; // Êàðòèíêà } *KomG; а объявление функции следующее void OutPict(int X,int Y,int sx,int sy,byte *Pict) Компилятор ругается типа Error[Pe167]: argument of type "byte (*)[10]" is incompatible with parameter of type "byte *" E:\work\AVR IAR C\Panno\office.c 232
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|