|
Новичок на С, Помогите разобраться со структурой проекта |
|
|
|
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
|
|
|
|
|
 |
Ответов
|
Mar 7 2006, 01:26
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Чувствую, что я скоро всем надоем, и отвечать мне никто не будет. Но у меня уже есть прогресс! Я написал большую часть проги и откомпиллил её без ошибок!!! Вот такой вот вопрос: Есть объявление функции. В качестве параметра 32 битное число. Я хочу использовать его побайтно. Могу я сделать так? union uint32_u { uint32_t dw; uint8_t bt[4]; }; в вызове использовать типа: uint32_u addr; а при обращении использовать unsigned long int addr. Или как поступить в данном случае. Как обратится к байтам длинного числа не пребегая к операциям типа ">> 8 ...."
|
|
|
|
|
Mar 7 2006, 20:56
|

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

|
Цитата(SasaVitebsk @ Mar 7 2006, 03:26)  Или как поступить в данном случае. Как обратится к байтам длинного числа не пребегая к операциям типа ">> 8 ...." Кстати говоря, с большой долей вероятности при достаточном уровне оптимизации компилятор сам не будет использовать сдвиги, а просто возьмет нужный байт из регистра или из памяти. Во всяком случае, IAR так делает. Вообще, очень полезно бывает смотреть на сгенерированный компилятором код, чтобы что-то там оптимизировать (если это хочется сделать). Пример: Код unsigned char CRC(...) { int crc; ... return crc ? 1 : 0; // 0 - все в порядке, не ноль - ошибка } Дает совершенно правильный, но не слишком оптимальный для AVR код (на IAR). Вычисление кода возврата по return компилируется в 10 байтов. Можно улучшить ситуацию, записав вот так: Код return (crc | (crc >> 8)); // 0 - все в порядке, не ноль - ошибка При видимом усложнении кода получаем вместо 10-ти уже 6 байтов. Неплохо. Но самое интересное будет, если переставить местами операнды и добавить лишние 0xff: Код return ((crc >> 8) | (crc & 0xff)); // 0 - все в порядке, не ноль - ошибка Это компилируется всего в 4 байта, несмотря на увеличение количества операций. Поэтому крайне рекомендуется при необходимости писать оптимально для конкретного процессора изучать генерируемый компилятором код. Иногда можно обнаружить совершенно неочевидные вещи.
|
|
|
|
|
Mar 7 2006, 22:22
|

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

|
Цитата(osnwt @ Mar 7 2006, 22:56)  Код return ((crc >> 8) | (crc & 0xff)); // 0 - все в порядке, не ноль - ошибка Это компилируется всего в 4 байта, несмотря на увеличение количества операций. Поэтому крайне рекомендуется при необходимости писать оптимально для конкретного процессора изучать генерируемый компилятором код. Иногда можно обнаружить совершенно неочевидные вещи. на ассемблере для этой задачи (0- все в порядке, не 0 - ошибка crc16) требуется всего одна команда or al, ah (2 байта), поэтому при необходимости получить оптимальный код, неплохо бы изучить ассемблер конкретного процессора.. Вопрос, лишь в том оправдается ли затраченное время (немалое) на получение оптимального кода для конкретного процессора?
|
|
|
|
|
Mar 7 2006, 22:41
|

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

|
Цитата(defunct @ Mar 8 2006, 00:22)  Цитата(osnwt @ Mar 7 2006, 22:56)  Код return ((crc >> 8) | (crc & 0xff)); // 0 - все в порядке, не ноль - ошибка Это компилируется всего в 4 байта, несмотря на увеличение количества операций. на ассемблере для этой задачи (0- все в порядке, не 0 - ошибка crc16) требуется всего одна команда or al, ah (2 байта), поэтому при необходимости получить оптимальный код, неплохо бы изучить ассемблер конкретного процессора.. Вопрос, лишь в том оправдается ли затраченное время (немалое) на получение оптимального кода для конкретного процессора? Одна команда - это два байта. Вторые два байта - это, собственно, ret. Фрагмент листинга компилятора: // 159 // 160 // returned 0 means CRC is OK // 161 return ((crc >> 8) | (crc & 0xff)); OR R16, R17 Однозначно ассемблер надо знать, иначе смысла смотреть на генерируемый код нет никакого. А насчет оправдания затрат - во первых, это надо сделать примерно раз и дальше использовать везде. Во вторых, это дает результат, и не такой малый. Скажем, компилированная GCC ассемблерная часть USB драйвера от Objective Development получается на 166 байтов короче, чем она же, но скомпилированная IAR. А на написанном мной куске того же объема результат прямо противоположный, и при этом я не оптимизировал тот свой код вручную. Это - результат вполне определенной оптимизации исходника USB под GCC, о чем вполне определенно пишет автор в readme IAR порта (не уверен, появился ли тот порт на их сайте или еще нет, так как последняя версия лежит у меня, всё ход не дойдет ее дотестировать). В третьих, всё подряд оптимизировать не имеет смысла. Но в ряде случаев это просто необходимо. Когда мой бут вылез за пределы 4-х кило на 200 байтов, мне пришлось приложить ряд усилий, чтобы вернуть его обратно. При этом ничем не было пожертвовано, и код не потерял читабельности. Правда, пришлось переписать часть кода Atmel, да и свой немного поправить. Зато всё осталось на C, и поддерживать его будет проще. Я сам был поборником ассемблера, ибо в свое время общался больше чем с десятком-полутора разных вариантов. Но с некоторых пор мнение изменил. Проще поддерживать все же C код. А на ассемблер надо переносить только критически важные участки: ISR и т.п. Вот это реально будет экономить время на поддержке.
|
|
|
|
|
Mar 8 2006, 11:27
|

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

|
Цитата Я вот тут подумал, чем надеяться на оптимизация компилятора не проще ли просто писать, то что требуется: Код return crc != 0 Увы, нет. Сравните с предыдущим листингом: Код // 160 // returned 0 means CRC is OK // 161 // return ((crc >> 8) | (crc & 0xff)); // 162 return crc != 0; OR R16, R17 BREQ ??crcApplicationCheck_1 LDI R16, 1 RJMP ??crcApplicationCheck_2 ??crcApplicationCheck_1: LDI R16, 0 ??crcApplicationCheck_2: Логическая операция должна вернуть 0 или 1. А побитовая - что угодно, лишь бы не ноль. Опять же, если не стоит задачи оптимизации, то писать надо то, что надо. Но иногда приходится извернуться, и это верно для любых компиляторов. ЗЫ. В приведенном примере я сам поражен: и это - максимальная оптимизация в IAR??? Ведь LDI R16, 0 - совершенно излишняя команда в данном случае.
Сообщение отредактировал osnwt - Mar 8 2006, 11:29
|
|
|
|
|
Mar 8 2006, 12:31
|

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

|
Цитата(osnwt @ Mar 8 2006, 13:27)  Увы, нет. Сравните с предыдущим листингом: После того как написал пост - проверил, заметил, потому и удалил пост... Цитата ЗЫ. В приведенном примере я сам поражен: и это - максимальная оптимизация в IAR??? Ведь LDI R16, 0 - совершенно излишняя команда в данном случае. Да поразительно работает оптимизация..
|
|
|
|
Сообщений в этой теме
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 defunct Цитата(Rst7 @ Feb 8 2006, 15:17) Гм, да м... Feb 8 2006, 22:45 dxp Цитата(defunct @ Feb 9 2006, 04:45) Вопро... Feb 9 2006, 06:10 Rst7 Цитата(defunct @ Feb 9 2006, 00:45) Тогда... Feb 9 2006, 08:22  defunct Цитата(Rst7 @ Feb 9 2006, 10:22) Теперь п... Feb 9 2006, 11:55   Rst7 Цитата(defunct @ Feb 9 2006, 13:55) Хорош... Feb 9 2006, 12:56    defunct Цитата(Rst7 @ Feb 9 2006, 14:56) Можно, о... Feb 9 2006, 13:42 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 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 Цитата(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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|