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

 
 
> Новичок на С, Помогите разобраться со структурой проекта
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
 
Start new topic
Ответов
defunct
сообщение Feb 8 2006, 22:45
Сообщение #2


кекс
******

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



Цитата(Rst7 @ Feb 8 2006, 15:17) *
Гм, да можно было и у меня спросить... Приятно, когда на твоих исходниках люди учатся wink.gif


Тогда у меня к Вам, как к автору кода, есть пара вопросов:
1. почему нельзя было просто вызвать IPrec() в обработчике прерывания?
2. из-за чего весь сыр-бор с сохранением стеков?

Цитата(dxp @ Feb 8 2006, 09:07) *
Не все, а только используемые. Компилятор обязан генерить код, не нарушающий целостность работы программы, не более того.
....
Исходя из этого, если нужен максимально быстрый обработчик прерываний, то вызов функций нецелесообразен. Если все-таки такая необходимость есть, то имеет смысл подумать, нельзя ли сделать эту функцию встраиваемой и разместить ее определение в заголовочном файле так, чтобы ее определение было доступно компилятору в точке компиляции кода обработчика прерывания.


Спасибо, что поправили меня.
Вопрос: а если вызываемая в обработчике функция определена в том же самом модуле, в котором определен и обработчик прерывания, потребуется ли определять ее как встраиваемую или компилятор и так будет "знать" какие регистры ей используются, и сгенерит код для сохранения только их?

Сообщение отредактировал defunct - Feb 9 2006, 03:56
Go to the top of the page
 
+Quote Post
Rst7
сообщение Feb 9 2006, 08:22
Сообщение #3


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата(defunct @ Feb 9 2006, 00:45) *
Тогда у меня к Вам, как к автору кода, есть пара вопросов:
1. почему нельзя было просто вызвать IPrec() в обработчике прерывания?
2. из-за чего весь сыр-бор с сохранением стеков?


1. Возможно вы заметили, что IPreciver есть не конечный автомат, а обычный код, скажем так, поток (нить, thread) выполнения. Посему есть ответ и на вопрос 2 - весь сыр-бор - это организация двух (точнее трех) задач - main, IPreciver, IPtransmitter. Из них IPxxx - это задачи, которые передают управление в основную задачу только тогда, когда им надо ждать символ из входного потока (IPreciver) или ждать окончания передачи символа в выходной поток (IPtransmiter). И получают они управление по соответствующим прерываниям. Почему так - объясняю. Представте, что вам надо получить в буфер 20 байт. Как вы пишете это без использования прерываний:

char s[20];
char *p=s;
char i=20;
do
{
*p++=rxchar();
}while(--i);

Просто и понятно.

Теперь представте это как автомат. Необходимо хранить указатели, состояние, и т.д. Каждое прерывание их необходимо загрузить, потом выгрузить. Весьма накладно, когда обработчик большой и сложный - как например TCP/IP. Поэтому, в том проекте, который мы обсуждаем, сделана такая многозадачка с использованием функций исключительно библиотеки. Т.е. что получается с сохранением контекста:

1. Обработчик прерываний штатно сохраняет все scratch-регистры, т.к. есть вызов функции в обработчике (функция setjmp и longjmp). Также обработчик сохраняет SREG и если AVR большой, всяческие RAMPZ. Точнее сохраняет компилятор.
2. Функция setjmp сохраняет все localstore-регистры,оба указателя стека SP и Y, а также PC. В результате имеем полностью сохраненный контекст задачи в двух местах - часть регистров лежит в CSTACK задачи, остальное - в jmp_buf.

Назад - аналогично. Прелести метода в том, что ни одной асмовской комманды нет. Единственное колдовство - инициализация задачи прямо в jmp_buf. При анализе суммарного кода почти нет потерь на на переключение, если сравнивать чисто с асм-вариантом - буквально 1 лишний CALL.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
defunct
сообщение Feb 9 2006, 11:55
Сообщение #4


кекс
******

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



Цитата(Rst7 @ Feb 9 2006, 10:22) *
Теперь представте это как автомат. Необходимо хранить указатели, состояние, и т.д. Каждое прерывание их необходимо загрузить, потом выгрузить. Весьма накладно, когда обработчик большой и сложный - как например TCP/IP. Поэтому, в том проекте, который мы обсуждаем, сделана такая многозадачка с использованием функций исключительно библиотеки. Т.е. что получается с сохранением контекста:

Хорошо, имеется некая структура данных (массив и индексы), по сути в этой структуре хранится весь контекст приемника. В чем заключается сложность обращения к этой структуре из обработчика прерывания? Ни в чем. Непонятно для чего может потребоваться еще что-то сохранять, когда просто попав в обработчик прерывания можно работать непосредственно с этой структурой данных (не затрагивая других структур данных).
Цитата
2. Функция setjmp сохраняет все localstore-регистры,оба указателя стека SP и Y, а также PC. В результате имеем полностью сохраненный контекст задачи в двух местах - часть регистров лежит в CSTACK задачи, остальное - в jmp_buf.

Т.е. вы сделали подобие полноценного диспетчера задач, что ж похвально. Однако, зачем усложнять себе жизнь, когда предполагается всего три задачи, причем четко разграниченные по назначению. Даже если задача относительно ресурсоемкая, она может выполняться непосредственно в контексте прерывания. Если же по каким-то причинам не может - тогда можно организовать диспетчеризацию непосредственно в основном потоке программы, что в любом случае будет проще и не потребует дополнительной памяти на сохранение контекстов задач.
простейшая диспетчеризация, внутри функций-задач рассматриваются условия "запуска", которые устанавливаются обработчиками прерываний и сбрасываются после отработки самими "задачами":

Код
   for(;;)
   {
      task1();
      task2();
      task3();
    }
Go to the top of the page
 
+Quote Post
Rst7
сообщение Feb 9 2006, 12:56
Сообщение #5


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата(defunct @ Feb 9 2006, 13:55) *
Хорошо, имеется некая структура данных (массив и индексы), по сути в этой структуре хранится весь контекст приемника. В чем заключается сложность обращения к этой структуре из обработчика прерывания? Ни в чем. Непонятно для чего может потребоваться еще что-то сохранять, когда просто попав в обработчик прерывания можно работать непосредственно с этой структурой данных (не затрагивая других структур данных).


Можно, однако это раздувает код, т.к. все локальные переменные превращаются в статические. А само сохранение регистров (и последующее восстановление) остается и никуда не девается. А так убиваем двух зайцев - код уменьшаем, улучшаем читаемость этого всего дела, т.к. весь алгоритм лежит последовательно, а не по кусочкам, выполнить то, выполнть это...

Цитата
Код
   for(;;)
   {
      task1();
      task2();
      task3();
    }


Аналогично - все превращается в автомат и совершенно не читабельно. Тем более, что эта программа (это стек TCP/IP) как понимаете не самоцель, а лишь маленькая часть большой программы, а вы предлагаете весь софт писать вот так?

ЗЫ Наверное, надо другую тему организовать под названием "Какие у сапожников взгляды на искусство" wink.gif


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
defunct
сообщение Feb 9 2006, 13:42
Сообщение #6


кекс
******

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



Цитата(Rst7 @ Feb 9 2006, 14:56) *
Можно, однако это раздувает код, т.к. все локальные переменные превращаются в статические. А само сохранение регистров (и последующее восстановление) остается и никуда не девается. А так убиваем двух зайцев - код уменьшаем, улучшаем читаемость этого всего дела, т.к. весь алгоритм лежит последовательно, а не по кусочкам, выполнить то, выполнть это...

Не все переменные превращаются в статические. Статическими будут только переменные, которые необходимо хранить между входами в обработчик прерывания. По расходу памяти если сравнить с Вашим способом - "те же консервы, вид сбоку" smile.gif

Насчет улучшения читаемости - для кого? Углядеть алгоритм работы многозадачной системы - всегда сложнее чем однозадачной.

Цитата
Аналогично - все превращается в автомат и совершенно не читабельно. Тем более, что эта программа (это стек TCP/IP) как понимаете не самоцель, а лишь маленькая часть большой программы, а вы предлагаете весь софт писать вот так?

я не предлагаю так писать софт, я его так пишу.

for{;;}
{
DispatchLalala();
KernelDispatchblablabla();
DoSomethingElse();
sleep();
}


Цитата
ЗЫ Наверное, надо другую тему организовать под названием "Какие у сапожников взгляды на искусство" wink.gif

smile.gif
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- SasaVitebsk   Новичок на С   Feb 7 2006, 21:56
- - Pat   Цитата(SasaVitebsk @ Feb 7 2006, 23:56) 2...   Feb 7 2006, 22:48
- - defunct   Цитата(SasaVitebsk @ Feb 7 2006, 23:56) 1...   Feb 7 2006, 23:04
- - SasaVitebsk   Спасибо всем за ответы и присланные примеры. Ещё б...   Feb 8 2006, 01:40
|- - defunct   Цитата(SasaVitebsk @ Feb 8 2006, 03:40) 1...   Feb 8 2006, 02:50
|- - dxp   Цитата(defunct @ Feb 8 2006, 08:50) Компи...   Feb 8 2006, 07:07
- - Pyku_He_oTTyda   ЦитатаСкачал PDFы и сделал книжечки Не поделитесь,...   Feb 8 2006, 05:29
- - Эрик   SasaVitebsk! Я тоже начал осваивать IAR Embed...   Feb 8 2006, 10:02
- - _artem_   По пункту 3 : Предполагаю что setjmp запоминает ре...   Feb 8 2006, 12:47
|- - Rst7   Цитата(_artem_ @ Feb 8 2006, 14:47) По пу...   Feb 8 2006, 13:17
|- - dxp   Цитата(defunct @ Feb 9 2006, 04:45) Вопро...   Feb 9 2006, 06:10
- - SasaVitebsk   Ещё раз спасибо всем ответившим. Перевариваю. ...   Feb 9 2006, 11:56
- - SasaVitebsk   По ходу написания возникло ещё несколько вопросов,...   Feb 14 2006, 00:12
- - vet   1) Не рекомендуется использовать динамическое выде...   Feb 14 2006, 06:28
- - IgorKossak   SasaVitebsk, если Вы склоняетесь к п. 1).б), то Ва...   Feb 14 2006, 07:30
- - SasaVitebsk   Цитата(vet @ Feb 14 2006, 10:28) 1) Не ре...   Feb 14 2006, 19:40
|- - IgorKossak   Цитата(SasaVitebsk @ Feb 14 2006, 21:40) ...   Feb 16 2006, 09:30
- - SasaVitebsk   Спасибо, попробую разные варианты и доложу как пол...   Feb 16 2006, 17:30
- - SasaVitebsk   1) Насколько я понял запись типа " *str++ ...   Feb 20 2006, 22:39
|- - dxp   Цитата(SasaVitebsk @ Feb 21 2006, 04:39) ...   Feb 21 2006, 11:36
|- - IgorKossak   Цитата(SasaVitebsk @ Feb 21 2006, 00:39) ...   Feb 21 2006, 17:14
- - SasaVitebsk   Цитата(dxp @ Feb 21 2006, 15:36) Вопрос н...   Feb 21 2006, 17:16
|- - dxp   Цитата(SasaVitebsk @ Feb 21 2006, 23:16) ...   Feb 22 2006, 08:13
- - SasaVitebsk   DXP ты всё правильно понимаешь, но я писал на ASMе...   Mar 1 2006, 11:07
|- - dxp   Цитата(SasaVitebsk @ Mar 1 2006, 17:07) Т...   Mar 1 2006, 14:04
|- - defunct   Цитата(dxp @ Mar 1 2006, 16:04) Во-первых...   Mar 1 2006, 18:26
||- - IgorKossak   Цитата(defunct @ Mar 1 2006, 20:26) Цитат...   Mar 1 2006, 18:33
||- - dxp   Цитата(IgorKossak @ Mar 2 2006, 00:33) Ци...   Mar 3 2006, 05:30
|- - SasaVitebsk   Цитата(dxp @ Mar 1 2006, 18:04) Во-первых...   Mar 2 2006, 18:13
|- - Balaganov   Цитата(SasaVitebsk @ Mar 2 2006, 20:13) v...   Mar 2 2006, 20:48
|- - dxp   Цитата(SasaVitebsk @ Mar 3 2006, 00:13) b...   Mar 3 2006, 05:43
- - vet   Нет, идентификатор массива сам является указателем...   Mar 1 2006, 11:24
- - vet   ЦитатаВо вторых если я хотел сделать массив указат...   Mar 2 2006, 18:19
- - SasaVitebsk   отсутствует ...\avr\bin\nwtdavr.dll...   Mar 3 2006, 09:53
|- - dxp   Цитата(SasaVitebsk @ Mar 3 2006, 15:53) о...   Mar 3 2006, 10:57
- - appsoft   Сообщение об отсутствии nwtdavr.dll наблюдал в рез...   Mar 3 2006, 11:10
- - SasaVitebsk   Цитата(SasaVitebsk @ Feb 14 2006, 23:40) ...   Mar 5 2006, 16:22
- - beer_warrior   KomG->Pict это уже сам по себе указатель т.е. з...   Mar 5 2006, 17:28
- - SasaVitebsk   Пользуюсь книгой Шилдт"Полный справочник по С...   Mar 5 2006, 21:23
- - vet   Так и нужно. Можно без скобок.   Mar 5 2006, 21:49
- - SasaVitebsk   "vet" твой ответ добавил мне уверенности...   Mar 5 2006, 22:20
|- - defunct   Цитата(SasaVitebsk @ Mar 6 2006, 00:20) И...   Mar 6 2006, 00:36
- - SasaVitebsk   Чувствую, что я скоро всем надоем, и отвечать мне ...   Mar 7 2006, 01:26
|- - defunct   Цитата(SasaVitebsk @ Mar 7 2006, 03:26) М...   Mar 7 2006, 02:18
|- - dxp   Цитата(SasaVitebsk @ Mar 7 2006, 07:26) Е...   Mar 7 2006, 04:51
|- - osnwt   Цитата(SasaVitebsk @ Mar 7 2006, 03:26) И...   Mar 7 2006, 20:56
|- - defunct   Цитата(osnwt @ Mar 7 2006, 22:56) Код ret...   Mar 7 2006, 22:22
|- - osnwt   Цитата(defunct @ Mar 8 2006, 00:22) Цитат...   Mar 7 2006, 22:41
|- - osnwt   ЦитатаЯ вот тут подумал, чем надеяться на оптимиза...   Mar 8 2006, 11:27
|- - defunct   Цитата(osnwt @ Mar 8 2006, 13:27) Увы, не...   Mar 8 2006, 12:31
|- - osnwt   Цитата(defunct @ Mar 8 2006, 14:31) После...   Mar 8 2006, 13:59
- - SasaVitebsk   Беседа была интересная. И я планирую проверить н...   Mar 11 2006, 17:24
|- - osnwt   Если вопросы ко мне - попробую ответить. Цитата(S...   Mar 11 2006, 19:47
- - beer_warrior   ЦитатаТретий. Насколько сложно программу написанну...   Mar 11 2006, 21:51
|- - osnwt   Цитата(beer_warrior @ Mar 11 2006, 23:51)...   Mar 11 2006, 22:05
- - defunct   Цитата(SasaVitebsk @ Mar 11 2006, 19:24) ...   Mar 11 2006, 23:51
|- - osnwt   Цитата(defunct @ Mar 12 2006, 01:51) Я бы...   Mar 12 2006, 01:38
|- - defunct   Цитата(osnwt @ Mar 12 2006, 03:38) Кроме ...   Mar 12 2006, 01:53
|- - osnwt   Цитата(defunct @ Mar 12 2006, 03:53) Цита...   Mar 12 2006, 14:23
- - beer_warrior   2 osnwt ЦитатаКак пояснил Кристиан, gcc не рассчит...   Mar 12 2006, 11:23
- - SasaVitebsk   Похоже даже максимального уровня оптимизации мне б...   Mar 16 2006, 21:19
|- - vet   Цитата(SasaVitebsk @ Mar 17 2006, 00:19) ...   Mar 16 2006, 22:21
|- - osnwt   Цитата(SasaVitebsk @ Mar 16 2006, 23:19) ...   Mar 17 2006, 10:53
- - beer_warrior   Цитатапочему компилятор так упорно применяет коман...   Mar 16 2006, 21:55
- - alekseykoj   У IAR синтаксис обычный для языка С. Т.е описание ...   Mar 17 2006, 14:19
|- - osnwt   Цитата(alekseykoj @ Mar 17 2006, 16:19) У...   Mar 17 2006, 14:41
- - SasaVitebsk   Я извиняюсь перед всеми. Надо было более детально ...   Mar 17 2006, 17:59
|- - Old1   Цитата(SasaVitebsk @ Mar 17 2006, 21:59) ...   Mar 17 2006, 18:53
|- - osnwt   Цитата(Old1 @ Mar 17 2006, 20:53) Компиля...   Mar 17 2006, 19:52
- - SasaVitebsk   Цитата(Old1 @ Mar 17 2006, 22:53) Компиля...   Mar 17 2006, 19:38
- - SasaVitebsk   osnwt спасибо за расширенный ответ. Детали и нюанс...   Mar 19 2006, 13:05
|- - osnwt   Цитата(SasaVitebsk @ Mar 19 2006, 15:05) ...   Mar 19 2006, 14:32
|- - osnwt   Цитата(osnwt @ Mar 19 2006, 16:32) *p++ (...   Mar 19 2006, 18:38
- - defunct   Как говорит уважаемый АП - лучше написать два раза...   Mar 19 2006, 16:50
- - SasaVitebsk   Я это обнаружил с самого начала, но решил посмотре...   Mar 19 2006, 20:27
|- - osnwt   Цитата(SasaVitebsk @ Mar 19 2006, 22:27) ...   Mar 19 2006, 23:04
- - SasaVitebsk   Спасибо всем помогавшим. Сегодня в общих чертах пр...   Mar 20 2006, 18:19
- - SasaVitebsk   Подскажите спецы (IAR). Компилятор очищает перемен...   Mar 22 2006, 10:48
- - SasaVitebsk   Подскажите спецы (IAR). Компилятор очищает перемен...   Mar 22 2006, 11:03
- - defunct   __no_init ?   Mar 22 2006, 11:17
- - SasaVitebsk   Спасибо. Сегодня ине глючит у меня. Поэтому топик ...   Mar 22 2006, 12:29
|- - defunct   Цитата(SasaVitebsk @ Mar 22 2006, 14:29) ...   Mar 22 2006, 13:09
- - SasaVitebsk   Всё ещё сложнее чем Вы думаете. И вто же время д...   Mar 22 2006, 20:42
- - defunct   1. избавляться от "дыр" в массиве можно ...   Mar 22 2006, 21:37
- - SasaVitebsk   В массиве только указатели на "команды"....   Mar 23 2006, 21:39
|- - defunct   Цитата(SasaVitebsk @ Mar 23 2006, 23:39) ...   Mar 23 2006, 23:30
- - SasaVitebsk   Нашёл функцию "memcpy" скорее всего это ...   Mar 24 2006, 14:42
|- - osnwt   Цитата(SasaVitebsk @ Mar 24 2006, 16:42) ...   Mar 25 2006, 07:08
- - defunct   /offtop ЦитатаА всётаки что на счёт программы. Та...   Mar 24 2006, 15:42
- - SasaVitebsk   Цитата(defunct @ Mar 24 2006, 19:42) Как ...   Mar 25 2006, 16:01
- - SasaVitebsk   А вот вопрос для понимания. Почему компилятор сохр...   Mar 27 2006, 10:07
- - beer_warrior   Правильный ответ 2. Индексной адресацией удобно бе...   Mar 27 2006, 11:23
- - SasaVitebsk   Такой вот вопрос: При входе в подпрограмму передаю...   Apr 2 2006, 09:42


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

 


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


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