Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
menzoda
Вымогатель припоя
Сообщения: 535
Зарегистрирован: Вт авг 28, 2012 22:21:33

Re: Вопросы по С/С++ (СИ)

Сообщение menzoda »

YS писал(а):Будет конфликтовать со встроенными определениями.
Я это так, в пример привел, без учета того, что что-то там определено по умолчанию. В конце-концов можно назвать не PD2, а PIND2.
YS писал(а):И макросы я бы в скобочки-то заключал...
Все время про них забываю. Просто я не использую такую нотацию, а пишу сразу числами: 0x01, 0x02, 0x04... Даже без дефайнов, вот так:

Код: Выделить всё

if (PIND & 0x1) {...}
Реклама
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение YS »

я не использую такую нотацию, а пишу сразу числами
Я когда-то тоже так писал. Пока не стал путаться в своем же коде. :)
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Реклама
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Re: Вопросы по С/С++ (СИ)

Сообщение shads »

menzoda писал(а):
YS писал(а):И макросы я бы в скобочки-то заключал...
Все время про них забываю. Просто я не использую такую нотацию, а пишу сразу числами: 0x01, 0x02, 0x04... Даже без дефайнов, вот так:

Код: Выделить всё

if (PIND & 0x1) {...}
Так не создать универсальной вещи, которая бы была похожа на библиотеку, и которую можно было бы легко применять в других проектах. Каждый раз придется глубоко шерстить...

Так что лучше сразу привыкать к подключению заголовочника.
Правда они (отдельные файлы заголовочников) когда библиотек много - меня раздражают, поэтому свои библиотечки я пишу в одном заголовочном файле (без сишного файла библиотеки).
Так файлов становится в 2 раза меньше, соответственно легче переключатся между файлами библиотек, быстрее работа идет, да и нагляднее намного, тут же определения, тут же функции...
Конечно это не профессионально, но, пока тяжелых библиотек нет - и так пойдет :)
Единственное, настраиваемые параметры в каждом файле - лучше расположить в самом начале, визуально выделить и отделить от последующих функций... тогда получается не хуже чем с отдельными c и h файлами...
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Re: Вопросы по С/С++ (СИ)

Сообщение shads »

menzoda писал(а):А еще лучше так

Код: Выделить всё

#define PD2    1 << 2

while (PIND & PD2)
{
    ...
}
Кстати я именно так и делаю, только имена ставлю более реальные, например так:

Код: Выделить всё

#define BTN_PIN            PINC                    
#define BTN_LINE_UP     (1<<0) 
#define BTN_LINE_DN     (1<<1)
потом проверяю нажатие так:

Код: Выделить всё

if (! (BTN_PIN & BTN_LINE_UP)) {}
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Re: Вопросы по С/С++ (СИ)

Сообщение ibiza11 »

shads писал(а):поэтому свои библиотечки я пишу в одном заголовочном файле (без сишного файла библиотеки)
это до тех пор, пока не нужно будет эту библиотеку использовать одновременно в нескольких исходных файлах одного проекта. в этом случае посыпятся ошибки повторного включения в проект.
Ставим плюсы: )
Реклама
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Re: Вопросы по С/С++ (СИ)

Сообщение shads »

Вот... жду, как скоро этот момент настанет :) чтобы появился стимул перестроится.....
Реклама
Аватара пользователя
aam
Собутыльник Кота
Сообщения: 2994
Зарегистрирован: Сб фев 20, 2010 14:00:12
Откуда: Москва

Re: Вопросы по С/С++ (СИ)

Сообщение aam »

Короче, возвращаясь ка глюкам с IAR... Достало меня это и решил разобраться. Даже взял проц выбрал вместо тини 2313 тини 4313 с в 2 раза большей памятью (задал в опциях его). Но линкер опять орет:

Код: Выделить всё

Building configuration: LED_cnt - Debug 
Updating build tree... 
main.c  
Linking 
Error[e16]: Segment CODE (size: 0x7fa align: 0x1) is too long for segment definition. At least 0x3a more bytes needed.  
The problem occurred while processing the segment placement command  
"-Z(CODE)CODE=_..X_FLASH_BASE-_..X_FLASH_END", where at the moment of placement the available memory  
ranges were "CODE:3f-7ff" 
   Reserved ranges relevant to this placement: 
   CODE:2a-32           NEAR_F 
   CODE:33-3e           INITTAB 
   CODE:3f-7ff          CODE 
Error while running Linker 
 
Total number of errors: 1 
Total number of warnings: 0 
Поскольку в листинге не все, то открыл мап-файл. Вот что там ДО того как начинает выскакивать ошибка:

Код: Выделить всё

                ****************************************
                *                                      *
                *            MODULE SUMMARY            *
                *                                      *
                ****************************************

Module               CODE      DATA      XDATA
------               ----      ----      -----
                    (Rel)  (Rel)  (Abs)  (Rel)
?C_MUL_L01             16
?C_STARTUP             26
?EEPROM_8              44
?FILLER_BYTES          18
  + common             24
?RESET
  + common              2
?S_MUL_L02             32
?S_SHL_L02             12
?US_SHR_L02            12
?__exit                 6
?low_level_init         4
?segment_init          80
main                1 610    125     19     38
  + common             24
N/A (command line)            64
N/A (alignment)
----------          -----    ---     --     --
Total:              1 860    189     19     38
  + common             24
И дальше в конце:

Код: Выделить всё

1 866 bytes of CODE  memory (+             18 range fill )
   189 bytes of DATA  memory (+ 19 absolute )
    38 bytes of XDATA memory

Errors: none
Warnings: none
Ну извините, какого хрена когда у 4313 4 Кб флеши?? Даже если по каким-то причинам прога "думает", что там Тини2313, то там 2048 байт, т. е. у меня даже запас есть. Понятно, что в МАП-файле расписана вся память, а не только из моего сишника. Т. е. там и умножения всякие и библиотеки и т. п.
При этом в Лист-файле до того как ошибка вылетит:

Код: Выделить всё

19 bytes in segment ABSOLUTE
 1 592 bytes in segment CODE
    48 bytes in segment EEPROM_I
    12 bytes in segment INITTAB
     4 bytes in segment INTVEC
     9 bytes in segment NEAR_F
   123 bytes in segment TINY_I
   123 bytes in segment TINY_ID
     4 bytes in segment TINY_Z
 
 1 724 bytes of CODE  memory (+ 16 bytes shared)
   127 bytes of DATA  memory (+ 19 bytes shared)
    48 bytes of XDATA memory

Errors: none
Warnings: none
И после того как дописал в проге и вылетела ошибка:

Код: Выделить всё

19 bytes in segment ABSOLUTE
 1 596 bytes in segment CODE
    48 bytes in segment EEPROM_I
    12 bytes in segment INITTAB
     4 bytes in segment INTVEC
     9 bytes in segment NEAR_F
   123 bytes in segment TINY_I
   123 bytes in segment TINY_ID
     4 bytes in segment TINY_Z
 
 1 728 bytes of CODE  memory (+ 16 bytes shared)
   127 bytes of DATA  memory (+ 19 bytes shared)
    48 bytes of XDATA memory

Errors: none
Warnings: none
Т. е. прога после дописания увеличилась всего на 4 байта. А уже почему-то не лезет


Куда еще посмотреть?
С тиней 2313 та же байда была... :(
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение BCluster »

Ну то что у вас не поставилась 4313 это точно. В опциях то поставить можно, только вот я думаю что lnk файл он берет от 2313.
Кстати, выложите lnk файл, который испольуется линкером.
Он пытается разместить 2042 байта в сегмент размером 1984. Откуда он их взял - другой вопрос.
В листе то увеличилось на 4 байта. Однако как вы сами указали, в мапе информация полнее, вполне вероятно, что для ваших изменений понадобилось еще что-то добавить в код.
Аватара пользователя
aam
Собутыльник Кота
Сообщения: 2994
Зарегистрирован: Сб фев 20, 2010 14:00:12
Откуда: Москва

Re: Вопросы по С/С++ (СИ)

Сообщение aam »

Что интересно, когда назад задаю 2313, орет даже если я убрал эту строчку, которая заставляла линкер орать с 4313. Т. е. даже если 4313 прошел не целиком, он прошел частично и влияет на итоговый результат (орет/не орет).
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение BCluster »

Очень интересно однако :) Ну выложите файлик линкера... У меня нет иара для авр
Аватара пользователя
aam
Собутыльник Кота
Сообщения: 2994
Зарегистрирован: Сб фев 20, 2010 14:00:12
Откуда: Москва

Re: Вопросы по С/С++ (СИ)

Сообщение aam »

Вот. Но собственно, основное то я написал уже.
BCluster писал(а):Он пытается разместить 2042 байта в сегмент размером 1984.
Я вот не пойму откуда сегмент в 1984 байта?? Разве флеш у 2313 не 2048?
Но тиня 4313 точно подцепилась, т. к. если выбираю в Project-Options... обратно тини 2313, то линкер выкидывает ошибку даже при удалении строчки, которая вызывает ошибку при 4313. Т. е. явно, что там еще лезет до определенного момента, а здесь уже не лезит никак.
Вложения
LED_cnt.map.txt
(75.61 КБ) 185 скачиваний
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение BCluster »

Потому что помимо непосредственно кода, есть и другие сегменты, занимающие flash
Аватара пользователя
Psych
Опытный кот
Сообщения: 848
Зарегистрирован: Ср мар 02, 2011 07:47:39
Откуда: Уфа

Re: Вопросы по С/С++ (СИ)

Сообщение Psych »

aam писал(а):Я вот не пойму откуда сегмент в 1984 байта??
А посмотрите где и как скомпилилось. То есть по каким адресам растасканно в дизассемблере.
Зы прога вся ваша???
Аватара пользователя
aam
Собутыльник Кота
Сообщения: 2994
Зарегистрирован: Сб фев 20, 2010 14:00:12
Откуда: Москва

Re: Вопросы по С/С++ (СИ)

Сообщение aam »

BCluster писал(а):Потому что помимо непосредственно кода, есть и другие сегменты, занимающие flash
Да какие фрагменты, если это уже с учетом линковки - т. е. там вплоть до умножения/деления распихано? Да и не могут же фрагменты в 2 раза больше памяти занять чем прога? Ведь проц то Тини 4313 выбран.
Psych писал(а):Зы прога вся ваша???
Моя конечно.
Psych писал(а):А посмотрите где и как скомпилилось.
А где смотреть? В ХЕКСе? Или где?
В листинге компилятора, понятное дело, только мои сишники и там в результате размер меньше указан, чем в мапе. И что даст смотреть дизассемблер и в чем его дезассемблировать?

Когда стояла 2313 меня еще не так смущало - типа всякое бывает. Но когда я указал 4313, дописал еще немного кода, а линкер орет да с такими результатами в плане количества байт - очень странно кажется.
Аватара пользователя
Psych
Опытный кот
Сообщения: 848
Зарегистрирован: Ср мар 02, 2011 07:47:39
Откуда: Уфа

Re: Вопросы по С/С++ (СИ)

Сообщение Psych »

aam писал(а):А где смотреть? В ХЕКСе? Или где?
Нуууу ввобще-то в IAR дизассемблере(в режиме отладки). Хотя нет. Это не нужно.
Тут на лицо косяк файла линкера. Rebuild делали?
Аватара пользователя
aam
Собутыльник Кота
Сообщения: 2994
Зарегистрирован: Сб фев 20, 2010 14:00:12
Откуда: Москва

Re: Вопросы по С/С++ (СИ)

Сообщение aam »

Psych писал(а):Rebuild делали?
100 раз :)) Я ведь напишу строчку - и ребилд сразу. Чтоб ошибки увидеть. Вот перестала в 2313 лезть, поменял на 4313 и дальше кодить. А тут опять, но байты-то даже и вдвое не возросли, судя по файлам...
Предположение, что прога пишет не байты, а слова - отпадает. Тиня 2313 отваливалась при тыще с чем-то, т. е. если умножить на 2, то больше 2048 намного.

Да, все оптимизации выкрутил на минимальный объем. По дефолту при установке ХЕКС раза в 2 больше получался когда только прогу начинал писать.
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение YS »

aam, а вы не пробовали пересоздать проект и перенести код копипастом? Мне такое иногда помогало, причем именно с IAR'ом.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Re: Вопросы по С/С++ (СИ)

Сообщение shads »

YS писал(а):aam, а вы не пробовали пересоздать проект и перенести код копипастом? Мне такое иногда помогало, причем именно с IAR'ом.
Мне такое помогало и в AVRStudio4.18 несколько раз...
Правда вся своя писанина никогда не моросила... а вот сторонняя несколько раз было такое, что только пересоздание проекта и перенос текста помогали...
Аватара пользователя
aam
Собутыльник Кота
Сообщения: 2994
Зарегистрирован: Сб фев 20, 2010 14:00:12
Откуда: Москва

Re: Вопросы по С/С++ (СИ)

Сообщение aam »

Пока не пробовал. Я если честно проц еще не выбрал. Точнее, выбрал - Мегу 8, а Тини 4313 поставил временно чтоб код компилился пока и чтоб покодить еще можно было. Но увидев эти баги, задумался, может это всего лишь глюки и не влезет ли все в Тиню 2313, как и задумывалось в самом начале написания проги.
Раз так - попробую.
Но обязательно ли переносить код именно копипастом?
Недостаточно ли просто создать проект и скпировать сами файлы-сишники и Н? У меня их там несколько.
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение YS »

Но обязательно ли переносить код именно копипастом?
Не знаю, мне было удобнее копипастом.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Ответить

Вернуться в «Разные вопросы по МК»