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

.....
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--; то ошибка исчезает
Спойлер
Код: Выделить всё
#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 так убивает, и что причина может быть в этом

...
А как еще можно умножить 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 файлы писать