Спойлер


Если пытаться в STM32 найти железо от MRF24J40, то никакие skill'ы не помогут.Chip115 писал(а): хм. Думал об этом, но индусы из микрочипа не просто так же написали эту фигню?
В целом я правильно понял назначение этих строк?
Вах... я чет и не подумал что long long так убивает, и что причина может быть в этомoleg110592 писал(а):не влазит код в мегу8 - надо пожирнее мегу или от long long отказаться
Код: Выделить всё
Parameter *= 16666666;
Parameter /= 100000000;
Дык парсер то как раз не проблема...dosikus писал(а):shads , в сети парсеров GPS как грязи . Смысл городить велосипед ?

Ясный перец... архитектура 32 бита... я бы даже предположил бы, что должно получиться еще меньше чем 520 байт...oleg110592 писал(а):решить на STM32F030K6T6 ARM Cortex M0
"Пол царства отдаю, и дочьку в жены" токма объясните, что нужно сделать чтобы такой размер получился?!...WiseLord писал(а):это что-то у автора проблемы не так, а не у avr-gcc.
Код: Выделить всё
Parameter *= 16666666;
Parameter /= 100000000;

Думаю, дело в тех аргументах avr-gcc, что на Ваших скриншотах полностью не видны: -Map=gps_data_to_UART....shads писал(а):"Пол царства отдаю, и дочьку в жены" токма объясните, что нужно сделать чтобы такой размер получился?!...
Усохни моя душенька... не верю своим глазам... надо пошшупать... ато ишшо вдруг оптицский обман здрения.....WiseLord писал(а):Пожалуйста:.....
Ануке просканируйте своим зорким взглядом...WiseLord писал(а):Думаю, дело в тех аргументах avr-gcc, что на Ваших скриншотах полностью не видны: -Map=gps_data_to_UART....
Явно помимо предоставленного кода где-то в Makefile к проекту подцеплено ещё что-то тяжеловесное, и линковщик не может всё это вместить в 8 кБ.
А под винду такая игрушка шусествует?WiseLord писал(а):в качестве IDE использую Qt Creator. Очень неплохой вариант для linux, всяко шустрее Eclipse.
Код: Выделить всё
PROGMEM uint8_t Txt1[] = {"text1"};
PROGMEM uint8_t Txt2[] = {"TEXT2"};
PROGMEM struct{
uint8_t *pTxt, UpLim, DnLim;
}Menu [] = {
{Txt1, 1,2},
{Txt2, 3,4}
};Код: Выделить всё
Menu[0].pTxt
Menu[1].pTxt Код: Выделить всё
uint8_t shift = 0;Код: Выделить всё
Menu[shift ].pTxtКод: Выделить всё
#define F_CPU 8000000
#define UART_BAUD 9600
#include <avr/pgmspace.h>
#include <avr/io.h>
//--------------------------------------------------------------------------------
//тексты и структура
PROGMEM const uint8_t Txt1[] = {"text1"};
PROGMEM const uint8_t Txt2[] = {"TEXT2"};
PROGMEM const struct{
const uint8_t *pTxt;
uint8_t UpLim, DnLim;
}Menu[] = {
{Txt1, 1,2},
{Txt2, 3,4}
};
//--------------------------------------------------------------------------------
//Глобальные переменные
uint8_t MenuNum = 1;
//--------------------------------------------------------------------------------
//Передача байта по UART
void UartTransmByte (uint8_t byte)
{
while (! (UCSRA & (1<<UDRE))){} // Wait for empty transmit buffer
UDR = byte; // Put data into buffer, sends the data
}
//передача int значения по UART
void UartTransmInt (uint16_t word)
{
uint8_t temp;
UartTransmByte ('0');
UartTransmByte ('x');
temp = (word>>12) & 0x0f;
if (temp < 10) UartTransmByte (temp + 0x30);
else UartTransmByte (temp + 0x37);
temp = (word>>8) & 0x0f;
if (temp < 10) UartTransmByte (temp + 0x30);
else UartTransmByte (temp + 0x37);
temp = (word>>4) & 0x0f;
if (temp < 10) UartTransmByte (temp + 0x30);
else UartTransmByte (temp + 0x37);
temp = word & 0x0f;
if (temp < 10) UartTransmByte (temp + 0x30);
else UartTransmByte (temp + 0x37);
UartTransmByte (',');
}
//--------------------------------------------------------------------------------
int main (void)
{
//Настройка UART
uint16_t BaudRateTemp = (F_CPU / UART_BAUD / 16 - 1);//скорость работы UART
UBRRH = (BaudRateTemp>>8);
UBRRL = BaudRateTemp;
UCSRC = (1<<URSEL)|(1<<USBS)| //2 стоп бита
(1<<UCSZ1)|(1<<UCSZ0); //формат посылки - 8 бит
UCSRB = (0<<RXEN)|(1<<TXEN); //разрешена передача
MenuNum = 1;
UartTransmInt ((uint16_t)Menu[MenuNum].pTxt);
while (1){}
}
//--------------------------------------------------------------------------------
Кстати, до сих пор я так и не встречал неадекватного поведения со стороны компилятора, все трудности решались открытием для себя определенных правил, соглашений си, анси и т.д..... так что самому не охота кого бы то ни было обвинять... тем более такого уважаемого оппонента как компилятор...ARV писал(а):прежде чем обвинять компилято
Вы бы лучше поднапряглись, да все таки посоветовали что то дельное... ато про фигурные скобки - как то не серьезноARV писал(а):вы бы изучили как следует язык Си. что это за объявление строк с фигурными скобками?!
и еще ряд замечаний - перечислять лень.
А как по другому решить размещение массива структур в PROGMEM?ARV писал(а):вы учитываете, что строки у вас в PROGMEM, а в структуре указатель на гште8_е в ОЗУ? принципиально тут проблемы нет, но она может появиться в месте, где вы к этому указателю обращаетесь.
тем более у WiseLord работает... Наверное он свой компиль чем то прикармливаетпринципиально тут проблемы нет
Здесь фактически аргумент функции UartTransmInt - это некий адрес в ОЗУ, а вовсе не значение, которое лежит в структуре в поле pTxt. В принципе, это передаваемое число может быть любым. Чтобы добраться до адреса, хранимого в flash-памяти, надо выполнить что-то вродеUartTransmInt ((uint16_t)Menu[MenuNum].pTxt);
P.S. А строки, хранимые во Flash-памяти, объявлять надо как-то так:UartTransmInt (pgm_read_word(&Menu[MenuNum].pTxt));
Код: Выделить всё
static const uint8_t labelSTBY[] PROGMEM = "Standby";ВОТ!!! конечно же... как это я так протупил...WiseLord писал(а):Чтобы добраться до адреса, хранимого в flash-памяти, надо выполнить что-то вродеUartTransmInt (pgm_read_word(&Menu[MenuNum].pTxt));