Страница 209 из 386

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

Добавлено: Пт ноя 07, 2014 22:23:35
shads
Аlex писал(а):А что если замучить malloc() / free() ?
Ведь даже в плюсах всякие классы, на подобии String, основаны на том же динамическом выделении/освобождении памяти.
Ой... я в Си пока буксую... а как речь о плюсах заходит - у меня вообще искры из глаз сыплются :shock: .....

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

Добавлено: Пт ноя 07, 2014 22:35:01
Аlex
Функции malloc() и free().
То, что там упоминается С++, не обращайте внимания. В С тоже есть эти функции. Но для их использования, компилятору необходима некая область памяти, называемая кучей (heap), которая обычно настраивается где-то в настройках компилятора.

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

Добавлено: Пт ноя 07, 2014 23:44:12
Леонид Иванович
Аллокаторы памяти сами по себе прожорливы, критиковал их как-то: http://leoniv.livejournal.com/193667.html

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

Добавлено: Сб ноя 08, 2014 15:21:00
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

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

Добавлено: Сб ноя 08, 2014 15:34:33
oleg110592
а обязательно по определенному адресу? Напишите
const unsigned char myLongAddress[8] = {EUI_0,EUI_1,EUI_2,EUI_3,EUI_4,EUI_5,EUI_6,EUI_7};
будет размещено во флэше, адрес можно получить через указатель

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

Добавлено: Сб ноя 08, 2014 15:38:16
Chip115
oleg110592 писал(а):а обязательно по определенному адресу? Напишите
const unsigned char myLongAddress[8] = {EUI_0,EUI_1,EUI_2,EUI_3,EUI_4,EUI_5,EUI_6,EUI_7};
будет размещено во флэше, адрес можно получить через указатель
хм. Думал об этом, но индусы из микрочипа не просто так же написали эту фигню?
В целом я правильно понял назначение этих строк?

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

Добавлено: Сб ноя 08, 2014 16:00:53
oleg110592
думаю надо почитать документацию к компилятору - для чего нужно #pragma romdata longAddressLocation

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

Добавлено: Вс ноя 09, 2014 13:49:20
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){}
}
 
Изображение
Изображение



Изображение

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

Добавлено: Вс ноя 09, 2014 16:06:07
oleg110592
не влазит код в мегу8 - надо пожирнее мегу или от long long отказаться:
СпойлерИзображение

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

Добавлено: Вс ноя 09, 2014 16:11:48
dosikus
shads , в сети парсеров GPS как грязи . Смысл городить велосипед ?
Chip115 писал(а): хм. Думал об этом, но индусы из микрочипа не просто так же написали эту фигню?
В целом я правильно понял назначение этих строк?
Если пытаться в STM32 найти железо от MRF24J40, то никакие skill'ы не помогут. :)))

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

Добавлено: Пн ноя 10, 2014 02:18:36
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

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

Добавлено: Пн ноя 10, 2014 06:37:25
ks0
А че, просто поделить нельзя?!

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

Добавлено: Пн ноя 10, 2014 08:31:42
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
СпойлерИзображение

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

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

Не ну результат AVR меня просто сразил :)...

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

Добавлено: Пн ноя 10, 2014 11:28:43
WiseLord
Меня тоже сразил, и я не поверил, поэтому решил перепроверить:
Изображение
Так что это что-то у автора проблемы не так, а не у avr-gcc. Либо что-то ещё крупное к проекту подключено, чего мы не видим, а этот код является той каплей, что переполняет море.

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

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

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

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

Parameter *= 16666666;
Parameter /= 100000000;
И кстати что это у вас за оболочка такая прикольная?

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

Добавлено: Пн ноя 10, 2014 12:20:41
oleg110592
да GCC AVR 4.9.2 нормально компилит
СпойлерИзображение
пробовал eclipse+AVR plugin+GCC AVR 4.9.2
выше оболочка, я так понял, Qt Creator+GCC AVR

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

Добавлено: Пн ноя 10, 2014 14:29:25
WiseLord
Пожалуйста:

Изображение

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

Явно помимо предоставленного кода где-то в Makefile к проекту подцеплено ещё что-то тяжеловесное, и линковщик не может всё это вместить в 8 кБ.

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

Добавлено: Пн ноя 10, 2014 15:09:24
shads
WiseLord писал(а):Пожалуйста:.....
Усохни моя душенька... не верю своим глазам... надо пошшупать... ато ишшо вдруг оптицский обман здрения.....
WiseLord писал(а):Думаю, дело в тех аргументах avr-gcc, что на Ваших скриншотах полностью не видны: -Map=gps_data_to_UART....
Явно помимо предоставленного кода где-то в Makefile к проекту подцеплено ещё что-то тяжеловесное, и линковщик не может всё это вместить в 8 кБ.
Ануке просканируйте своим зорким взглядом...
СпойлерИзображение
WiseLord писал(а):в качестве IDE использую Qt Creator. Очень неплохой вариант для linux, всяко шустрее Eclipse.
А под винду такая игрушка шусествует?

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

Добавлено: Пн ноя 10, 2014 15:19:59
oleg110592
похоже WinAVR это переварить не может - попробуйте сборку AVR GCC
Qt Creator под Windows есть, насчет AVR plugin для него не знаю - придется make файлы писать