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

 
 
> Новичок на С, Помогите разобраться со структурой проекта
SasaVitebsk
сообщение Feb 7 2006, 21:56
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 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) Профи, если можно вышлите какой-нибудь файл(ы) исходников (можно не рабочих, урезанных или с ошибками) по которым я мог бы посмотреть структуру программы. Лучше с прерываниями. Обязуюсь не распространять и использовать в качестве учебных. Пожалуйста не присылайте слишком больших, а то я зароюсь. smile.gif

Заранее благодарен. e-mail: sasa@c32dvina.com
Go to the top of the page
 
+Quote Post
7 страниц V  < 1 2 3 4 5 > »   
Start new topic
Ответов (30 - 44)
dxp
сообщение Mar 1 2006, 14:04
Сообщение #31


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 и так константнее некуда. smile.gif Я обычно использовал вид

__flash byte Array[] = { .... };

Оператор разименовывания ('*') при объявлении массива писать не надо, если только не хотите объявить массив указателей.

Вообще, я понял, что Вам надо типа двумерного массива - ну так и объявите явно массив массивов, зачем эти финты с адресами? И памяти меньше скушает.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
defunct
сообщение Mar 1 2006, 18:26
Сообщение #32


кекс
******

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



Цитата(dxp @ Mar 1 2006, 16:04) *
Во-первых, const не нужен - __flash и так константнее некуда. smile.gif Я обычно использовал вид


А почему в таком случае нельзя просто const использовать, все-таки const это из стандарта ansi-c, а __flesh всего-лишь приблуда от IAR.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Mar 1 2006, 18:33
Сообщение #33


Шаман
******

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



Цитата(defunct @ Mar 1 2006, 20:26) *
Цитата(dxp @ Mar 1 2006, 16:04) *

Во-первых, const не нужен - __flash и так константнее некуда. smile.gif Я обычно использовал вид


А почему в таком случае нельзя просто const использовать, все-таки const это из стандарта ansi-c, а __flesh всего-лишь приблуда от IAR.

В этом случае компилятор\линкер могут потребовать внешней ROM, где и будут храниться Ваши константы.
Что касается стандартов, то они хороши для PC, а для embedded приложений с невероятным количеством особенностей целевых архитектур "приблуды" зачастую необходимы.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Mar 2 2006, 18:13
Сообщение #34


Гуру
******

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



Цитата(dxp @ Mar 1 2006, 18:04) *
Во-первых, const не нужен - __flash и так константнее некуда. smile.gif Я обычно использовал вид

__flash byte Array[] = { .... };

Оператор разименовывания ('*') при объявлении массива писать не надо, если только не хотите объявить массив указателей.

Вообще, я понял, что Вам надо типа двумерного массива - ну так и объявите явно массив массивов, зачем эти финты с адресами? И памяти меньше скушает.


Спецы как всегда зрят в корень! biggrin.gif Их не обманешь. Уточню картину. smile.gif С учётом Ваших поправок.

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. И ещё ряд вопросов у меня к нему smile.gif
Где скачать?
Go to the top of the page
 
+Quote Post
vet
сообщение Mar 2 2006, 18:19
Сообщение #35


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



Цитата
Во вторых если я хотел сделать массив указателей правильно ли я объявил их ( &...) . Компилятор не выдал мне ошибки

Уже писал про это на прошлой странице.


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
Balaganov
сообщение Mar 2 2006, 20:48
Сообщение #36


Участник
*

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
dxp
сообщение Mar 3 2006, 05:30
Сообщение #37


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 и так константнее некуда. smile.gif Я обычно использовал вид


А почему в таком случае нельзя просто const использовать, все-таки const это из стандарта ansi-c, а __flesh всего-лишь приблуда от IAR.

В этом случае компилятор\линкер могут потребовать внешней ROM, где и будут храниться Ваши константы.

Добавлю: либо разместит объекты, объявленные как const, в ОЗУ. А его мало и жалко его тратить под неизменяемые данные.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
dxp
сообщение Mar 3 2006, 05:43
Сообщение #38


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* - это Вы обманули компилятор (и себя тоже smile.gif ). Этим самым Вы отключили контроль типов со стороны компилятора и взяли всю ответственность за правильность работы на себя. Компилятор тут "умыл руки". Не советую так делать. Вообще, найдется очень немного случаев, когда без void* действительно сложно обойтись и он оправдан. Но рассматриваемый случай совсем не этот.

Я не очень понимаю, что Вы хотите иметь в конечном итоге, но учитывая, что эти массивы как-то используются в каких-то функциях, и принимая во внимание тот факт, что раз массивы разные, то и функции с ними работают разные, - реализовать работу с ними через массив указателей на функции.

Цитата(SasaVitebsk @ Mar 3 2006, 00:13) *
И ещё отдельный вопрос. При запуске мой компилятор указывает мне на отсутствие одного из файлов DLL. И ещё ряд вопросов у меня к нему smile.gif
Где скачать?

На какую DLL? Никогда ничего подобного не встречал.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Mar 3 2006, 09:53
Сообщение #39


Гуру
******

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



отсутствует ...\avr\bin\nwtdavr.dll smile.gif
при этом проект компилится раза три-четыре. После чего указ. что-то о лицензии smile.gif
Ну я выхожу/вхожу и по новый. smile.gif сам компилятор мне с таблеткой пришёл, но я и новую пробовал. Похоже в нём чего-то не хватает.
Остановиться не могу, - к середине мая проект должен быть завершён. Пробую перейти на GCC. Но потом хочу вернуться и перекомпилить на IAR. А пока попробую найти где-нибудь ну и условную компиляцию чтоб на обоих, - не помешает. smile.gif Потом сверю скорость и объём.

По поводу ссылок. Несколько процедур будут однотипно обрабатывать эти массивы. Перед обработкой я явно указываю (определяю по размерности) тип массива и обрабатываю их. Если я сделаю так, то потом могу менять/добавлять новые массивы. (это массивы шрифтов).
Go to the top of the page
 
+Quote Post
dxp
сообщение Mar 3 2006, 10:57
Сообщение #40


Adept
******

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



Цитата(SasaVitebsk @ Mar 3 2006, 15:53) *
отсутствует ...\avr\bin\nwtdavr.dll smile.gif

Нету у меня такой дллки. Версия 4.12. И все без проблем работает.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
appsoft
сообщение Mar 3 2006, 11:10
Сообщение #41


Участник
*

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



Сообщение об отсутствии nwtdavr.dll наблюдал в результате "лечения" IAR версии 3.20 под XP. Появляется при каждый раз при старте компилятора. По моим наблюдениям на работоспособность не влияет.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Mar 5 2006, 16:22
Сообщение #42


Гуру
******

Группа: Свой
Сообщений: 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". Даже если он этот топик и не увидит. smile.gif

Вот теперь не то чтобы понятно, но чуть-чуть приблизился к пониманию. А ведь знающие люди месяц назад писали. Вот баран самоуверенный. Теперь более 500 строк текста перелопачиваю! smile.gif

Ещё вопрос. Хочу в подпрограмму передать ссылку. Это массив расположенный в структуре. На неё имеется указатель. Т.е. к самому массиву я обращаюсь 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
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Mar 5 2006, 17:28
Сообщение #43


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

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



KomG->Pict это уже сам по себе указатель т.е. значение KomG инкрементированнае на смещение Pict в структуре.
Чтобы доступиться к элементу Pict[N] указатель смещается еще на N байт.
А вы даете как аргумент адрес указателя.

Сообщение отредактировал beer_warrior - Mar 5 2006, 17:30


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


Гуру
******

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



Пользуюсь книгой Шилдт"Полный справочник по С" 4-е изд. Задаю вопрос когда уже совсем ....
Там указано: Чтобы с помощью указателя на структуру получить доступ к её членам, необходимо использовать оператор стрелка ->.

После этого приводится пример. Где описана процедура

void update(struct my_time *t) { // в принципе как у меня
t->seconds++; // в данном случае инкрементируется значение а не адрес
if (t->seconnds==60) { t->seconnds=0; // опять таки значение.

Вероятнее всего я чего-то не понимаю.

Давайте сначала.
Итак объявлен указатель t на структуру my_time (предположем что сама структура тоже есть):

struct my_time {
int hours;
int minutes;
int seconds;
} *t;

То по книге чтобы инкрементировать значение секунд мне необходимо выполнить оператор

t->seconds++;

Т.е. чтобы передать секунды в подпрограмму "по значению" мне также необходимо передать
"t->seconds" в списке параметров.
А если я хочу передать адрес секунд т.е передать "по ссылке"? Я пытаюсь сделать это так &(t->seconds).

Где в моих рассуждениях ошибка?
Заранее благодарю.
Go to the top of the page
 
+Quote Post
vet
сообщение Mar 5 2006, 21:49
Сообщение #45


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



Так и нужно. Можно без скобок.


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post

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

 


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


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