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

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

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

Сообщение shads »

Аlex писал(а):А что если замучить malloc() / free() ?
Ведь даже в плюсах всякие классы, на подобии String, основаны на том же динамическом выделении/освобождении памяти.
Ой... я в Си пока буксую... а как речь о плюсах заходит - у меня вообще искры из глаз сыплются :shock: .....
Реклама
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

Функции malloc() и free().
То, что там упоминается С++, не обращайте внимания. В С тоже есть эти функции. Но для их использования, компилятору необходима некая область памяти, называемая кучей (heap), которая обычно настраивается где-то в настройках компилятора.
Реклама
Аватара пользователя
Леонид Иванович
Друг Кота
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск
Контактная информация:

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

Сообщение Леонид Иванович »

Аллокаторы памяти сами по себе прожорливы, критиковал их как-то: http://leoniv.livejournal.com/193667.html
Аватара пользователя
Chip115
Сверлит текстолит когтями
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск
Контактная информация:

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

Сообщение Chip115 »

Всем привет!
Решил портировать код, который был написан для PIC18 на какой нить STM32F10x и заодно прокачать скилл написания программ на си.
Так вот натнулся на эти строки

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

#pragma romdata longAddressLocation = 0x0E
ROM unsigned char myLongAddress[8] = {EUI_0,EUI_1,EUI_2,EUI_3,EUI_4,EUI_5,EUI_6,EUI_7};
#pragma romdata
Я полагаю что нулевой элемент архива longAddressLocation будет расположен по адресу 0x0E. Так?

В доке на STM32 вот что пишут

The STM32F10xxx features up to 96 Kbytes of static SRAM. It can be accessed as bytes,
half-words (16 bits) or full words (32 bits). The SRAM start address is 0x2000 0000.


Будет ли работать этот кусок кода если я напишу вот так

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

#pragma romdata longAddressLocation = 0x2000 0000
ROM unsigned char myLongAddress[8] = {EUI_0,EUI_1,EUI_2,EUI_3,EUI_4,EUI_5,EUI_6,EUI_7};
#pragma romdata
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

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

Сообщение oleg110592 »

а обязательно по определенному адресу? Напишите
const unsigned char myLongAddress[8] = {EUI_0,EUI_1,EUI_2,EUI_3,EUI_4,EUI_5,EUI_6,EUI_7};
будет размещено во флэше, адрес можно получить через указатель
Реклама
Аватара пользователя
Chip115
Сверлит текстолит когтями
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск
Контактная информация:

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

Сообщение Chip115 »

oleg110592 писал(а):а обязательно по определенному адресу? Напишите
const unsigned char myLongAddress[8] = {EUI_0,EUI_1,EUI_2,EUI_3,EUI_4,EUI_5,EUI_6,EUI_7};
будет размещено во флэше, адрес можно получить через указатель
хм. Думал об этом, но индусы из микрочипа не просто так же написали эту фигню?
В целом я правильно понял назначение этих строк?
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Реклама
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

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

Сообщение oleg110592 »

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

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

Сообщение shads »

Гляньте пжалстя... что я такого криминального понаписал?.....
Тут конечно бессмыслица полная... но это из-за того что я лишнее повыкидывал...

Компиль (AVRStudio 4.19) ошибку кажет какую-то необычную... первый раз такую вижу...
И как то странно себя ведет... например если закомментировать i--; то ошибка исчезает :shock:
Спойлер

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

#include <avr/io.h>
 
int main (void)
{
	uint8_t i, Simb, BufTemp [8];	
	uint8_t *pBufRead = (uint8_t*) 0;
	uint8_t *pBufWrite = (uint8_t*) 0;
	long long Parameter = 0;

	for (i=8; i; i--){
		Parameter *= 10;
		Simb = *pBufRead++;
		Parameter += (Simb - '0');
	}

	for (i=0; i<8; i++){	
		BufTemp [7-i] = Parameter %10 + '0';
		Parameter /= 10;
	}
	i--;	
 
	while (i < 8){
		*pBufWrite++ = BufTemp [i++];
	}

	while (1){}
}
 
Изображение
Изображение



Изображение
Вложения
err.png
(3.37 КБ) 708 скачиваний
2.png
(30.77 КБ) 682 скачивания
1.png
(24.26 КБ) 723 скачивания
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

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

Сообщение oleg110592 »

не влазит код в мегу8 - надо пожирнее мегу или от long long отказаться:
СпойлерИзображение
Последний раз редактировалось oleg110592 Вс ноя 09, 2014 16:13:00, всего редактировалось 1 раз.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение dosikus »

shads , в сети парсеров GPS как грязи . Смысл городить велосипед ?
Chip115 писал(а): хм. Думал об этом, но индусы из микрочипа не просто так же написали эту фигню?
В целом я правильно понял назначение этих строк?
Если пытаться в STM32 найти железо от MRF24J40, то никакие skill'ы не помогут. :)))
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

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

Сообщение shads »

oleg110592 писал(а):не влазит код в мегу8 - надо пожирнее мегу или от long long отказаться
Вах... я чет и не подумал что long long так убивает, и что причина может быть в этом :shock: ...

А как еще можно умножить 8-ми значное число на 0,01666666 т.е. на 1/60, с минимальными потерями ресурса?...
Пробовал так

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

	Parameter *= 16666666;
	Parameter /= 100000000;
Дык только эти 2 строчки кушают 5кб памяти...

dosikus писал(а):shads , в сети парсеров GPS как грязи . Смысл городить велосипед ?
Дык парсер то как раз не проблема...
Нужно перевести значение координат из - градусы, минуты - в значение в градусы...
Т.е. по сути то что делает этот калькулятор... http://goondel.ucoz.ru
Аватара пользователя
ks0
Прорезались зубы
Сообщения: 238
Зарегистрирован: Чт фев 28, 2013 14:16:10

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

Сообщение ks0 »

А че, просто поделить нельзя?!
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

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

Сообщение oleg110592 »

не ради рекламы - интересно было, попробовал задачу shads решить на STM32F030K6T6 ARM Cortex M0, 48МГц, 32кб Flash, 4кб ОЗУ, корпус такой же TQFP32, цена у нас, такая же как и на ATMEGA8, компилятор Keil:

чистый main (только настройки тактовой частоты и стартап):
Program Size: Code=368 RO-data=208 RW-data=0 ZI-data=1024

программа shads
Program Size: Code=888 RO-data=208 RW-data=0 ZI-data=1024

получается эта же программа заняла всего то 520 байт против 9898 байт на AVR
СпойлерИзображение
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

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

Сообщение shads »

oleg110592 писал(а):решить на STM32F030K6T6 ARM Cortex M0
Ясный перец... архитектура 32 бита... я бы даже предположил бы, что должно получиться еще меньше чем 520 байт...

Не ну результат AVR меня просто сразил :)...
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

Меня тоже сразил, и я не поверил, поэтому решил перепроверить:
Изображение
Так что это что-то у автора проблемы не так, а не у avr-gcc. Либо что-то ещё крупное к проекту подключено, чего мы не видим, а этот код является той каплей, что переполняет море.
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

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

Сообщение shads »

WiseLord писал(а):это что-то у автора проблемы не так, а не у avr-gcc.
"Пол царства отдаю, и дочьку в жены" токма объясните, что нужно сделать чтобы такой размер получился?!...

И кстати проверьте пож, сколько покажет, если между первым и вторым циклами for, добавить две строчки:

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

Parameter *= 16666666;
Parameter /= 100000000;
И кстати что это у вас за оболочка такая прикольная?
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

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

Сообщение oleg110592 »

да GCC AVR 4.9.2 нормально компилит
СпойлерИзображение
пробовал eclipse+AVR plugin+GCC AVR 4.9.2
выше оболочка, я так понял, Qt Creator+GCC AVR
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

Пожалуйста:

Изображение

А так - да, в качестве IDE использую Qt Creator. Очень неплохой вариант для linux, всяко шустрее Eclipse.
shads писал(а):"Пол царства отдаю, и дочьку в жены" токма объясните, что нужно сделать чтобы такой размер получился?!...
Думаю, дело в тех аргументах avr-gcc, что на Ваших скриншотах полностью не видны: -Map=gps_data_to_UART....

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

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

Сообщение shads »

WiseLord писал(а):Пожалуйста:.....
Усохни моя душенька... не верю своим глазам... надо пошшупать... ато ишшо вдруг оптицский обман здрения.....
WiseLord писал(а):Думаю, дело в тех аргументах avr-gcc, что на Ваших скриншотах полностью не видны: -Map=gps_data_to_UART....
Явно помимо предоставленного кода где-то в Makefile к проекту подцеплено ещё что-то тяжеловесное, и линковщик не может всё это вместить в 8 кБ.
Ануке просканируйте своим зорким взглядом...
СпойлерИзображение
WiseLord писал(а):в качестве IDE использую Qt Creator. Очень неплохой вариант для linux, всяко шустрее Eclipse.
А под винду такая игрушка шусествует?
Вложения
1.gif
(17.67 КБ) 530 скачиваний
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

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

Сообщение oleg110592 »

похоже WinAVR это переварить не может - попробуйте сборку AVR GCC
Qt Creator под Windows есть, насчет AVR plugin для него не знаю - придется make файлы писать
Ответить

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