| Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
Avrstudio результат компиляции
04.03.2011, 05:22
|
|
|
Гражданин KAZUS.RUN
Регистрация: 01.09.2007
Сообщений: 897
Сказал спасибо: 278
Сказали Спасибо 57 раз(а) в 54 сообщении(ях)
|
Avrstudio результат компиляции
AVR Memory Usage
----------------
Device: atmega8535
Program: 810 bytes (9.9% Full)
(.text + .data + .bootloader)
Data: 512 bytes (100.0% Full)
(.data + .bss + .noinit)
Build succeeded with 0 Warnings...
Не подскажите что означает Data: 512 bytes (100.0% Full).............?????
Program: 810 bytes (9.9% Full) Это весь размер программы......
Хочу на другой чип перекинуть с памятью поменьше 2К........ А что вот это значит Data: 512 bytes (100.0% Full).............?????
А для перехода на другой чип придеться плату для stk500 покупать.... В чип дипе 7300.(((( Нашел на другой фирме 3200.... Приемлемо но впороться с памятью чипа нехочу..... Начинал программировать для 13тини..... Памяти не хватило.....((((((
Заранее спасибо......
|
|
|
|
04.03.2011, 06:21
|
|
|
Гуру портала
Регистрация: 17.07.2010
Адрес: мурмурляндия
Сообщений: 11,124
Сказал спасибо: 202
Сказали Спасибо 3,284 раз(а) в 2,150 сообщении(ях)
|
Re: Avrstudio результат компиляции
накакой чип то? на 8535?
зачем для него стк всякие?
я их шил еще лет 6 назад при помощи ком порта, 3 резисторов и понипрога
а щас можно купить узби дата кабель от старого сотика за 200 рублей и напрямую к чипу 4 провода и всё
или я не прав?
|
|
|
|
04.03.2011, 07:05
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 13.12.2004
Сообщений: 3,168
Сказал спасибо: 11
Сказали Спасибо 691 раз(а) в 503 сообщении(ях)
|
Re: Avrstudio результат компиляции
Сообщение от bass1981
|
|
Не подскажите что означает Data: 512 bytes (100.0% Full)
|
Что то тут не то. Не бывает заполнения памяти на 100%. Здесь выводится 3 секции в сумме. data - инициализированные переменные, bss - инициализированные 0 переменные, noinit - переменные не инициализированные ничем. Но - Си нужен стек. Да и не только Си, программа на ассемблере без него тоже не обойдется. А тут вся память задействована. Так не бывает. Если проект не секретный - выложите его здесь.
|
|
|
|
04.03.2011, 11:55
|
|
|
Вид на жительство
Регистрация: 03.06.2010
Сообщений: 451
Сказал спасибо: 35
Сказали Спасибо 168 раз(а) в 133 сообщении(ях)
|
Re: Avrstudio результат компиляции
Сообщение от kison
|
|
Что то тут не то. Не бывает заполнения памяти на 100%. .....
|
Еще как бывает  , даже так бывает:
|
Код:
|
AVR Memory Usage
----------------
Device: atmega64
Program: 4076 bytes (6.2% Full)
(.text + .data + .bootloader)
Data: 4492 bytes (109.7% Full)
(.data + .bss + .noinit) |
Другое дело что, как вы и сказали, нужен стек, и такой код правильно работать не будет.
|
|
|
|
04.03.2011, 13:41
|
|
|
Прописка
Регистрация: 21.09.2009
Сообщений: 218
Сказал спасибо: 1
Сказали Спасибо 29 раз(а) в 27 сообщении(ях)
|
Re: Avrstudio результат компиляции
Сообщение от bass1981
|
Device: atmega8535
Program: 810 bytes (9.9% Full) (.text + .data + .bootloader)
Data: 512 bytes (100.0% Full) (.data + .bss + .noinit)
Памяти не хватило(
|
Не знаю, что у вас за программа, но как правило, вместо части оперативной памяти можно использовать флеш. Обычно это неизменные строки, константы и т.п.
При работе с графическим экраном у меня было превышение рам 600%, всякие строки и графические символы размещались в рам. Я их перебросил во флешь и изменил метод доступа, стало 8%. Пример можно посмотреть здесь.
Последний раз редактировалось =GM=; 04.03.2011 в 13:48.
|
|
|
|
04.03.2011, 15:10
|
|
|
Гражданин KAZUS.RUN
Регистрация: 01.09.2007
Сообщений: 897
Сказал спасибо: 278
Сказали Спасибо 57 раз(а) в 54 сообщении(ях)
|
Re: Avrstudio результат компиляции
я их шил еще лет 6 назад при помощи ком порта, 3 резисторов и понипрога
200% С тобой согласен...... Лет пять назад я начал програмировать под микроконтроллеры, это был чит атмела АТ89...2051 насколько помню.... Писал на асемблере, паял програматор.... Пока сделал устройство. два месяца прошло..... Но это было 5 лет назат ... Сейчас такого позволить себе не могу вследствии нехватки времени... По работе связанн написанием программ на С (Хотя это сложно так выразиться: с + winapi + asm + и сторонние библиотеки).... Ну и чтоб время не тратить взял комплект разработчика stk500 В чип дипе 8000 стоит, нашел за 3150... Приемлемо чтоб не паять куча светодиодов для теста и т.д...... Данный код не влез в тини 13....... Я перенес его в 8535 для теста, все работает.... Еще плюс стк500 програмирование высоким напряжением для использования ресета как вывода (для тини13)...... Но увы память не мог просчитать до покупки всего......
Добавил функций в программу стало...
AVR Memory Usage
----------------
Device: atmega8535
Program: 836 bytes (10.2% Full)
(.text + .data + .bootloader)
Data: 542 bytes (105.9% Full)
(.data + .bss + .noinit)
Build succeeded with 0 Warnings...
При 100% кстатии программа корректно работала.......
Вот в компьютерных приложениях дата отвечает за всякие пременные и т.д. но в компьютерных приложениях windows обращаться можно почти ко всем местам памяти(прошу нестрого есть исключения это там если она только чтение или за пределам такото значения и т.д)..... Как в чипе это устроено ... Вот флаш мы прошили ..... это сам код , в редких случаях нужна его модификация так что эта память может быть только чтение....... А вот преременные нуждаються в доступе и на запись..... Также нужно как вы сказали распределить стек.... Мы используем ту флаш в которую прошили или еще есть какаято память отдельно????? как это понять по даташиту???? Чтоб не получить еще казус.....
Build succeeded with 0 Warnings...
Почему компилятор на это даже предупреждение не кинул?????
Спасибо всем кто откликнулся...
|
|
|
|
04.03.2011, 15:13
|
|
|
Гражданин KAZUS.RUN
Регистрация: 01.09.2007
Сообщений: 897
Сказал спасибо: 278
Сказали Спасибо 57 раз(а) в 54 сообщении(ях)
|
Re: Avrstudio результат компиляции
#define F_CPU 4000000
#include ‹avr/io.h› //Cтандартная библиотека ввода/вывода
#include ‹string.h› //Библиотека для работы с строками
#include ‹util/delay.h›
/*
#define DI 0
#define DO 1
#define CLK 2
#define CS 3
#define INS 4
#define WP 5
*/
#define DI 0
#define DO 1
#define CLK 2
#define CS 3
#define LED 4
// #define INS 4
// #define WP 5
char buffer [512]={}; //Буфер данных для записи/чтения
void Delay(uint32_t t)
{
uint32_t i;
for(i = 0; i ‹ t; i++) {
}
}
//Программа инициализации UART
/*
void uart_init(void)
{
UBRRH = 0x00; //256000 битрейт, 1 стоп бит, без проверки четности
UBRRL = 0x01;
UCSRA = 0x00;
UCSRB = (1‹‹RXEN)|(1‹‹TXEN); //Прием и передача разрешена
UCSRC = (1‹‹URSEL)|(1‹‹UCSZ1)|(1‹‹UCSZ0);
}
*/
//Программа передачи байта по UART
/*
void uart_transmit(unsigned char data)
{
while ( !( UCSRA & (1‹‹UDRE)) );
UDR = data;
}
//Программа приема байта по UART
unsigned char uart_receive (void)
{
while ( !(UCSRA & (1‹‹RXC)) );
return UDR;
}
//Программа передачи строки по UART
void uart_transmit_message(char* msg)
{ unsigned char i;
i=0; //Начальное значение переменной
//Цикл до перебора всех элементов строки
while ((i‹256)&(msg[i]!=0x00) )
{
//Отправка поэлементно символов строки
uart_transmit(msg[i]);
i++; //Увеличиваем номер элемента строки
}
}
*/
//Программа передачи байта карте SD|MMC
void spi_transmit (unsigned char data)
{
unsigned char i;
for (i=0;i‹8;i++) //Цикл перебора битов отправляемого байта
{
if ((data&0x80)==0x00) //Если все данные переданы
PORTB&=~_BV(DI); //Выставить бит данных
else
PORTB|=_BV(DI);
data=data‹‹1;
PORTB|=_BV(CLK); //Импульс
asm("nop"); //Пауза в 1 такт
PORTB&=~_BV(CLK);
}
}
//Программа приема байт от карты SD|MMC
unsigned char spi_receive (void)
{
//Декларация переменных
unsigned char i, res=0;
for(i=0;i‹8;i++)
{
PORTB|=_BV(CLK); //Фронт импульса
res=res‹‹1;
if ((PINB&_BV(DO))!=0x00)
res=res|0x01; //Считать бит данных
PORTB&=~_BV(CLK); //Спад испульса
asm("nop");
}
return res;
}
unsigned char sd_cmd(char b0, char b1, char b2, char b3, char b4, char b5)
//Отправка команды карте SD|MMC
{ unsigned char res;
long int count;
spi_transmit (b0); //Передать индекс команды
spi_transmit (b1); //Передать аргумент
spi_transmit (b2);
spi_transmit (b3);
spi_transmit (b4);
spi_transmit (b5); //Передать CRC
count=0;
do { //Подождпть R1 ответа
res=spi_receive();
count=count+1;
} while ( ((res&0x80)!=0x00)&&(count‹0xffff) );
return res;
}
unsigned char sd_card_init(void)
{ unsigned char i,temp;
long int count;
// if ((PINB&_BV(INS))!=0x00) return 1; //Проверка карты в слоту
for (i=0;i‹10;i++) //80 импульсов
spi_transmit (0xff);
PORTB&=~_BV(CS); //CS опустить
temp=sd_cmd (0x40,0x00,0x00,0x00,0x00,0x95); //CMD0
if (temp!=0x01) return 3; //Выйти, если ответ не 0х01
spi_transmit (0xff);
count=0;
do{
temp=sd_cmd (0x41,0x00,0x00,0x00,0x00,0x95); //CMD1
spi_transmit (0xff);
count=count+1;
} while ( (temp!=0x00)&&(count‹0xffff) ); //Ждем 0x01 ответа R1
if (count›=0xffff) return 4;
return 0;
}
unsigned char read_block (char* buff, unsigned char a1, unsigned char a2, unsigned char a3, unsigned char a4)
{ unsigned char temp;
long int count;
// if ((PINB&_BV(INS))!=0x00) return 1; //Проверка карты в слоту
temp=sd_cmd (0x51,a1,a2,a3,a4,0x95); //CMD17
if (temp!=0x00) return 5; //Выйти, если ответ не 0x00
spi_transmit (0xff);
count=0;
do{ //Ждем начала пакета данных
temp=spi_receive();
count=count+1;
} while ( (temp!=0xfe)&&(count‹0xffff) );
if (count›=0xffff) return 5;
for (count=0;count‹512;count=count+1) //Сохраняем данные
buff[count]=spi_receive();
spi_receive(); //Сохраняем CRC
spi_receive();
return 0;
}
unsigned char write_block (char* buff, unsigned char a1, unsigned char a2, unsigned char a3, unsigned char a4)
{ unsigned char temp;
long int count;
// if ((PINB&_BV(INS))!=0x00) return 1; //Проверка карты в слоту
// if ((PINB&_BV(WP))!=0x00) return 2; //Проверка write protect
temp=sd_cmd(0x58,a1,a2,a3,a4,0x95); //CMD24
if (temp!=0x00) return 6; //Выйти, если ответ не 0x00
spi_transmit (0xff);
spi_transmit (0xfe); //Начало пакета данных
for (count=0;count‹512;count=count+1) //Отослать данные
spi_transmit(buff[count]);
spi_transmit (0xff); //Отослать CRC
spi_transmit (0xff);
temp=spi_receive();
if ((temp&0x05)!=0x05) return 6; //Выйти, если данные не приняты
count=0;
do { //Ждем окончания busy состояния
temp=spi_receive();
count=count+1;
}while ( (temp!=0xff)&&(count‹0xffff) );
if (count›=0xffff) return 6;
return 0;
}
int reset(void)
{
return 0;
}
int main(void)
{
unsigned char temp;
int i;
DDRB = 0xFF;
while(1)
{
for(int i=1;i‹=128;i*=2)
{
PORTB=~i;
_delay_loop_2(300000);
}
}
// PORTB=_BV(CS)|_BV(DO)|_BV(DI)|_BV(LED);//|_BV(WP)|_BV(INS); //Инициализация портов
// DDRB=_BV(CS)|_BV(DI)|_BV(CLK)|_BV(LED);
// PORTB|=_BV(LED) ;
Delay(50000); //задержка
// PORTB&=~_BV(LED);
// uart_init(); //Инициализация UART
temp=sd_card_init(); //Инициализация карты
if (temp==0x00)
{
// uart_transmit_message("sd_card_init: initialization succes\r\n");
for (i=0;i‹512;i=i+1)
buffer[i]=0x30+(i%10); //Заполнить буфер 12345...
temp=write_block(buffer,0x00,0x00,0x02,0x00);//Записать буфер
/* if(temp==0x00) uart_transmit_message("write_block: block writte succes\r\n");
else if (temp==1) uart_transmit_message("write_block: fail, no card in the slot\r\n");
else if (temp==2) uart_transmit_message("write_block: fail, card write protected\r\n");
else uart_transmit_message("read_block: CMD24 fail\r\n");
*/
temp=read_block(buffer,0x00,0x00,0x02,0x00); //Считать буфер
if(temp==0x00) {
// uart_transmit_message("read_block: data block read succes:\r\n");
// for (i=0;i‹512;i=i+1) //Выслать буфер по UART
// uart_transmit(buffer[i]);
}
else if (temp==0x01)
{
//uart_transmit_message("read_block: fail, no card in the slot\r\n");
}
else
{
//uart_transmit_message("read_block: CMD17 fail\r\n");
}
}
else if (temp==0x01)
{
// uart_transmit_message("sd_card_init: fail, no card in the slot\r\n");
}
else if (temp==0x03)
{
// uart_transmit_message("sd_card_init: CMD0 fail\r\n");
}
else
{
// uart_transmit_message("sd_card_init: CMD1 fail\r\n");
}
while (1)
;
return 1;
}
А вот код..... Кажеться я его сейчас неправильно выложу....
|
|
|
|
04.03.2011, 15:23
|
|
|
Вид на жительство
Регистрация: 21.08.2007
Сообщений: 318
Сказал спасибо: 12
Сказали Спасибо 67 раз(а) в 61 сообщении(ях)
|
Re: Avrstudio результат компиляции
Сообщение от bass1981
|
|
char buffer [512]={}; //Буфер данных для записи/чтения
|
Резервирует использование 100% памяти. Делайте буфер меньше. Иначе не остаётся места для переменных
|
|
|
|
Сказали "Спасибо" Cybermaker
|
|
|
04.03.2011, 15:34
|
|
|
Прохожий
Регистрация: 29.03.2010
Сообщений: 3
Сказал спасибо: 4
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Avrstudio результат компиляции
Глобальный массив "char buffer [512]" занимает 512 байт, это все ОЗУ доступное для Вашей меги. У тини13 ОЗУ и того меньше всего 64 байта. Так что думайте как реорганизовать программу, чтобы использовать буффер меньшей длины.
PS Размер ОЗУ можно посмотреть для каждого микроконтроллера на первой странице datasheet, например, для тини13 оно выглядит так:- 64 Bytes Internal SRAM
|
|
|
|
Сказали "Спасибо" sspivak
|
|
|
04.03.2011, 16:04
|
|
|
Гражданин KAZUS.RUN
Регистрация: 01.09.2007
Сообщений: 897
Сказал спасибо: 278
Сказали Спасибо 57 раз(а) в 54 сообщении(ях)
|
Re: Avrstudio результат компиляции
Cybermaker спасиб все вкурил мне вообще там 3 байта нужно.... Вместо 512..... необратил на это сильно внимания.....
sspivak спасибо за расширенный ответ теперь понял как примерно все утроено в микроконтроллере..... Походу для них всетаки си еще рано -))))
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 16:21.
|
|