Jump to content
Sign in to follow this  
Guest Anna

Проблемы С Памятью

Recommended Posts

Guest Anna

Здравствуйте.

не могли бы Вы подсказать, как посмотреть,где именно он пишет в некорректную облать памяти.

#include <stdio.h>
#include <stdlib.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <avr/eeprom.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <inttypes.h>
#include "lcd_lib.h"
//define R2R port
#define R2RPORT PORTA
#define R2RDDR DDRA
//define button port and dedicated pins
#define BPORT PORTD
#define BPIN PIND
#define BDDR DDRD
#define DOWN 0//PORTD
#define LEFT 1//PORTD
#define START 2//PORTD
#define RIGHT 3//PORTD
#define UP 4//PORTD
//Define Highs Speed (HS) signal output
#define HSDDR DDRD
#define HSPORT PORTD
#define HS 5//PD5
//define eeprom addresses
#define EEMODE 0
#define EEFREQ1 1
#define EEFREQ2 2
#define EEFREQ3 3
#define EEDUTY 4
#define EEINIT E2END
#define RESOLUTION 0.095367431640625
#define MINFREQ 0//minimum frequency
#define MAXFREQ 65534//maximum DDS frequency
#define MN_No 5// number of menu items
//function prototypes
void delay1s(void);
void Timer2_Init(void);
void Timer2_Start(void);
void Timer2_Stop(void);
void Main_Init(void);
void Menu_Update(uint8_t);
void Freq_Update(void);
void Timer1_Start(uint8_t);
void Timer1_Stop(void);
void static inline Signal_OUT(const uint8_t *, uint8_t, uint8_t, uint8_t);
//adjust LCDsendChar() function for strema
static int LCDsendstream(char c, FILE *stream);
//----set output stream to LCD-------
static FILE lcd_str = FDEV_SETUP_STREAM(LCDsendstream, NULL, _FDEV_SETUP_WRITE);
//Menu Strings in flash
//menu 1
const uint8_t MN100[] PROGMEM="	 exp	 \0";
//Array of pointers to menu strings stored in flash
const uint8_t *MENU[]={
MN100 //menu 1 string
};
//various LCD strings
const uint8_t MNON[] PROGMEM="ON \0";//ON
const uint8_t MNOFF[] PROGMEM="OFF\0";//OFF
const uint8_t NA[] PROGMEM="	 NA	 \0";//Clear freq value
const uint8_t CLR[] PROGMEM="			 \0";//Clear freq value
const uint8_t MNClrfreq[] PROGMEM="		 \0";//Clear freq value
const uint8_t TOEEPROM[] PROGMEM="Saving Settings\0";//saving to eeprom
const uint8_t ONEMHZ[] PROGMEM="	 1MHz \0";//saving to eeprom
const uint8_t welcomeln1[] PROGMEM="AVR SIGNAL\0";
const uint8_t RND[] PROGMEM=" Random\0";
//variables to control TDA7313
struct signal{
volatile uint8_t mode; //signal
volatile uint8_t fr1; //Frequency [0..7]
volatile uint8_t fr2; //Frequency [8..15]
volatile int8_t fr3; //Frequency [16..31]
volatile uint32_t freq; //frequency value
volatile uint8_t flag; //if "0"generator is OFF, "1" - ON
volatile uint32_t acc; //accumulator
volatile uint8_t ON;
volatile uint8_t HSfreq; //high speed frequency [1...4Mhz]
volatile uint32_t deltafreq; //frequency step value
}SG;
//define signals
const uint8_t expwave[] __attribute__ ((section (".MySection1")))= //exp wave
{
0x00,0x09,0x12,0x1B,0x23,0x2c,0x34,0x3c,0x43,0x4B,0x52,0x59,0x60,0x67,0x6E,0x74,
0x7A,0x80,0x86,0x8C,0x91,0x97,0x9C,0xA1,0xA6,0xAA,0xAF,0xB3,0xB8,0xBC,0xC0,0xC3,
0xC7,0xCB,0xCE,0xD1,0xD4,0xD7,0xDA,0xDD,0xE0,0xE2,0xE4,0xE7,0xE9,0xEB,0xED,0xEF,
0xF0,0xF2,0xF3,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFE,0xFE,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfe,0xfd,0xfd,0xfc,0xfc,0xfb,0xfa,0xfa,
0xf9,0xf8,0xf7,0xf6,0xf5,0xf4,0xf3,0xf2,0xf1,0xf0,0xee,0xed,0xec,0xea,0xe9,0xe8,
0xe6,0xe5,0xe3,0xe2,0xe0,0xdf,0xdd,0xdb,0xda,0xd8,0xd6,0xd5,0xd3,0xd1,0xd0,0xce,
0xcc,0xca,0xc8,0xc7,0xc5,0xc3,0xc1,0xbf,0xbd,0xbb,0xba,0xb8,0xb6,0xb4,0xb2,0xb0,
0xae,0xac,0xaa,0xa8,0xa6,0xa4,0xa2,0xa1,0x9f,0x9d,0x9b,0x99,0x97,0x95,0x93,0x91,
0x8f,0x8e,0x8c,0x8a,0x88,0x86,0x84,0x82,0x80,0x7e,0x7d,0x7b,0x79,0x77,0x76,0x74,
0x72,0x70,0x6e,0x6d,0x6b,0x69,0x68,0x66,0x64,0x62,0x61,0x5f,0x5d,0x5c,0x5a,0x59,
0x57,0x55,0x54,0x52,0x51,0x4f,0x4e,0x4c,0x4b,0x49,0x48,0x46,0x45,0x44,0x42,0x41,
0x3f,0x3e,0x3d,0x3b,0x3a,0x39,0x37,0x36,0x35,0x34,0x31,0x30,0x2f,0x2e,0x2d,0x2b,
0x2a,0x29,0x29,0x28,0x27,0x26,0x25,0x24,0x23,0x22,0x21,0x20,0x1f,0x1e,0x1d,0x1c,
0x1b,0x1a,0x1a,0x19,0x18,0x17,0x16,0x15,0x15,0x14,0x13,0x12,0x11,0x11,0x10,0x0f,
0x0f,0x0e,0x0d,0x0d,0x0c,0x0b,0x0b,0x0a,0x09,0x09,0x08,0x08,0x07,0x07,0x06,0x06,
};

//array of pointers to signal tables
const uint8_t *SIGNALS[] ={
expwave
};
//adjust LCD stream fuinction to use with printf()
static int LCDsendstream(char c , FILE *stream)
{
LCDsendChar(c);
return 0;
}
//delay 1s
void delay1s(void)
{
uint8_t i;
for(i=0;i<100;i++)
{
_delay_ms(10);
}
}
//initialize Timer2 (used for button reading)
void Timer2_Init(void)
{
TCNT2=0x00;
sei();
}
//start timer2
void Timer2_Start(void)
{
TCCR2|=(1<<CS22)|(1<<CS21); //prescaller 256 ~122 interrupts/s
TIMSK|=(1<<TOV2);//Enable Timer0 Overflow interrupts
}
//stop timer 2
void Timer2_Stop(void)
{
TCCR0&=~((1<<CS22)|(1<<CS21)); //Stop timer0
TIMSK&=~(1<<TOV2);//Disable Timer0 Overflow interrupts
}
//Initial menu
//show initial signal and frequency
//generator is off
void Menu_Update(uint8_t on)
{
LCDclr();
CopyStringtoLCD(MENU[(SG.mode)], 0, 0 );
LCDGotoXY(0, 1);
if (SG.mode==6)
{
CopyStringtoLCD(CLR, 0, 1 );
LCDGotoXY(0, 1);
printf(" %5uHz", (uint16_t)SG.deltafreq);
}
if (SG.mode==7)
{
CopyStringtoLCD(CLR, 0, 1 );
CopyStringtoLCD(RND, 0, 1 );
}
if (SG.mode==8)
{
CopyStringtoLCD(CLR, 0, 1 );
LCDGotoXY(0, 1);
printf(" %5uMHz", SG.HSfreq);
}
if((SG.mode==0)||(SG.mode==1)||(SG.mode==2)||(SG.mode==3)||(SG.mode==4)||(SG.mode==5))
{
CopyStringtoLCD(CLR, 0, 1 );
LCDGotoXY(0, 1);
printf(" %5uHz", (uint16_t)SG.freq);
}
if (SG.mode!=6)
{
if(on==1)
CopyStringtoLCD(MNON, 13, 1 );
else
CopyStringtoLCD(MNOFF, 13, 1 );
}
}
//update frequency value on LCD menu - more smooth display
void Freq_Update(void)
{
if (SG.mode==6)
{
LCDGotoXY(0, 1);
printf(" %5uHz", (uint16_t)SG.deltafreq);
}
if (SG.mode==8)
{
//if HS signal
LCDGotoXY(0, 1);
printf(" %5uMHz", SG.HSfreq);
}
if((SG.mode==0)||(SG.mode==1)||(SG.mode==2)||(SG.mode==3)||(SG.mode==4)||(SG.mode==5))
{
LCDGotoXY(0, 1);
printf(" %5uHz", (uint16_t)SG.freq);
}
}
//External interrupt0 service routine
//used to stop DDS depending on active menu
//any generator is stopped by setting flag value to 0
//DDs generator which is inline ASM is stopped by setting
//CPHA bit in SPCR register
ISR(INT0_vect)
{
SG.flag=0;//set flag to stop generator
SPCR|=(1<<CPHA);//using CPHA bit as stop mark
//CopyStringtoLCD(MNOFF, 13, 1 );
SG.ON=0;//set off in LCD menu
loop_until_bit_is_set(BPIN, START);//wait for button release
}
//timer overflow interrupt service tourine
//checks all button status and if button is pressed
//value is updated
ISR(TIMER2_OVF_vect)
{
if (bit_is_clear(BPIN, UP))
//Button UP increments value which selects previous signal mode
//if first mode is reached - jumps to last
{
if (SG.mode==0)
{
SG.mode=MN_No-1;
}
else
{
SG.mode--;
}
//Display menu item
Menu_Update(SG.ON);
loop_until_bit_is_set(BPIN, UP);
}
if (bit_is_clear(BPIN, DOWN))
//Button Down decrements value which selects next signal mode
//if last mode is reached - jumps to first
{
if (SG.mode<(MN_No-1))
{
SG.mode++;
}
else
{
SG.mode=0;
}
//Display menu item
Menu_Update(SG.ON);
loop_until_bit_is_set(BPIN, DOWN);
}
if (bit_is_clear(BPIN, RIGHT))
//frequency increment
{
if(SG.mode==6)
{
if(SG.deltafreq==10000)
SG.deltafreq=1;
else
SG.deltafreq=(SG.deltafreq*10);
Freq_Update();
loop_until_bit_is_set(BPIN, RIGHT);
}
if (SG.mode==8)
{
//ifhigh speed signal
if(SG.HSfreq==8)
SG.HSfreq=1;
else
SG.HSfreq=(SG.HSfreq<<1);
Freq_Update();
loop_until_bit_is_set(BPIN, RIGHT);
}
if((SG.mode==0)||(SG.mode==1)||(SG.mode==2)||(SG.mode==3)||(SG.mode==4)||(SG.mode==5))
{
if ((0xFFFF-SG.freq)>=SG.deltafreq)
 SG.freq+=SG.deltafreq;
Freq_Update();
uint8_t ii=0;
//press button and wait for long press (~0.5s)
do{
 _delay_ms(2);
 ii++;
}while((bit_is_clear(BPIN, RIGHT))&&(ii<=250));//wait for button release
if(ii>=250)
{
 do{
 if ((0xFFFF-SG.freq)>=SG.deltafreq)
 SG.freq+=SG.deltafreq;
 Freq_Update();
 }while(bit_is_clear(BPIN, RIGHT));//wait for button release
}
}
}
if (bit_is_clear(BPIN, LEFT))
//frequency decrement
{
if(SG.mode==6)
{
if(SG.deltafreq==1)
SG.deltafreq=10000;
else
SG.deltafreq=(SG.deltafreq/10);
Freq_Update();
loop_until_bit_is_set(BPIN, LEFT);
}
if (SG.mode==8)
{
//ifhigh speed signal
if(SG.HSfreq==1)
SG.HSfreq=8;
else
SG.HSfreq=(SG.HSfreq>>1);
Freq_Update();
loop_until_bit_is_set(BPIN, LEFT);
}
if ((SG.mode==0)||(SG.mode==1)||(SG.mode==2)||(SG.mode==3)||(SG.mode==4)||(SG.mode==5))
{
if (SG.freq>=SG.deltafreq)
 SG.freq-=SG.deltafreq;
Freq_Update();
uint8_t ii=0;
//press button and wait for long press (~0.5s)
do{
 _delay_ms(2);
 ii++;
}while((bit_is_clear(BPIN, LEFT))&&(ii<=250));//wait for button release
if(ii>=250)
{
 do{
 if (SG.freq>=SG.deltafreq)
 SG.freq-=SG.deltafreq;
 Freq_Update();
 }while(bit_is_clear(BPIN, LEFT));//wait for button release
}
}
}
if (bit_is_clear(BPIN, START))
{
if(SG.mode!=6)
{
//saving last configuration
SG.fr1=(uint8_t)(SG.freq);
SG.fr2=(uint8_t)(SG.freq>>8);
SG.fr3=(uint8_t)(SG.freq>>16);
if (eeprom_read_byte((uint8_t*)EEMODE)!=SG.mode) eeprom_write_byte((uint8_t*)EEMODE,SG.mode);
if (eeprom_read_byte((uint8_t*)EEFREQ1)!=SG.fr1) eeprom_write_byte((uint8_t*)EEFREQ1,SG.fr1);
if (eeprom_read_byte((uint8_t*)EEFREQ2)!=SG.fr2) eeprom_write_byte((uint8_t*)EEFREQ2,SG.fr2);
if (eeprom_read_byte((uint8_t*)EEFREQ3)!=SG.fr3) eeprom_write_byte((uint8_t*)EEFREQ3,SG.fr3);
//Calculate frequency value from restored EEPROM values
SG.freq=(((uint32_t)(SG.fr3)<<16)|((uint32_t)(SG.fr2)<<8)|((uint32_t)(SG.fr1)));
//calculate accumulator value
SG.acc=SG.freq/RESOLUTION;
SG.flag=1;//set flag to start generator
SG.ON=1;//set ON on LCD menu
SPCR&=~(1<<CPHA);//clear CPHA bit in SPCR register to allow DDS
//Stop timer2 - menu inactive
Timer2_Stop();
//display ON on LCD
Menu_Update(SG.ON);
}
loop_until_bit_is_set(BPIN, START);//wait for button release
}
}
/*DDS signal generation function
Original idea is taken from
http://www.myplace.nu/avr/minidds/index.htm
small modification is made - added additional command which
checks if CPHA bit is set in SPCR register if yes - exit function
*/
void static inline Signal_OUT(const uint8_t *signal, uint8_t ad2, uint8_t ad1, uint8_t ad0)
{
asm volatile( "eor r18, r18 ;r18<-0" "\n\t"
"eor r19, r19 ;r19<-0" "\n\t"
"1:"	 "\n\t"
"add r18, %0 ;1 cycle" "\n\t"
"adc r19, %1 ;1 cycle" "\n\t"
"adc %A3, %2 ;1 cycle" "\n\t"
"lpm ;3 cycles" "\n\t"
"out %4, __tmp_reg__ ;1 cycle" "\n\t"
"sbis %5, 2 ;1 cycle if no skip" "\n\t"
"rjmp 1b ;2 cycles. Total 10 cycles" "\n\t"
:
:"r" (ad0),"r" (ad1),"r" (ad2),"e" (signal),"I" (_SFR_IO_ADDR(PORTA)), "I" (_SFR_IO_ADDR(SPCR))
:"r18", "r19"
);
}
void Timer1_Start(uint8_t FMHz)
{
switch(FMHz){
case 1:
//start high speed (1MHz) signal
OCR1A=7;
break;
case 2:
OCR1A=3;//2MHz
break;
case 4:
OCR1A=1;//4MHz
break;
case 8:
OCR1A=0;//8MHz
break;
default:
OCR1A=7;//defauls 1MHz
break;}
//Output compare toggles OC1A pin
TCCR1A=0x40;
//start timer without prescaler
TCCR1B=0b00001001;
}
void Timer1_Stop(void)
{
TCCR1B=0x00;//timer off
}
//main init function
void Main_Init(void)
{
//stderr = &lcd_str;
stdout = &lcd_str;
//--------init LCD----------
LCDinit();
LCDclr();
LCDcursorOFF();
//-------EEPROM initial values----------
if (eeprom_read_byte((uint8_t*)EEINIT)!='T')
{
eeprom_write_byte((uint8_t*)EEMODE,0x00);//initial mode 0 – OUT~~~~;
eeprom_write_byte((uint8_t*)EEFREQ1,0xE8);//initial frequency 1kHz
eeprom_write_byte((uint8_t*)EEFREQ2,0x03);
eeprom_write_byte((uint8_t*)EEFREQ3,0x00);
eeprom_write_byte((uint8_t*)EEINIT,'T');//marks once that eeprom init is done
//once this procedure is held, no more initialization is performed
}
//------restore last saved values from EEPROM------
SG.mode=eeprom_read_byte((uint8_t*)EEMODE);
SG.fr1=eeprom_read_byte((uint8_t*)EEFREQ1);
SG.fr2=eeprom_read_byte((uint8_t*)EEFREQ2);
SG.fr3=eeprom_read_byte((uint8_t*)EEFREQ3);
SG.freq=(((uint32_t)(SG.fr3)<<16)|((uint32_t)(SG.fr2)<<8)|((uint32_t)(SG.fr1)));
SG.acc=SG.freq/RESOLUTION;
SG.flag=0;
//default 1MHz HS signal freq
SG.HSfreq=1;
SG.deltafreq=100;
//------------init DDS output-----------
R2RPORT=0x00;//set initial zero values
R2RDDR=0xFF;//set A port as output
//-------------set ports pins for buttons----------
BDDR&=~(_BV(START)|_BV(UP)|_BV(DOWN)|_BV(RIGHT)|_BV(LEFT));
BPORT|=(_BV(START)|_BV(UP)|_BV(DOWN)|_BV(RIGHT)|_BV(LEFT));
//---------set ports pins for HS output---------
HSDDR|=_BV(HS);//configure as output
//-----------Menu init--------------
SG.ON=0;//default signal is off
Menu_Update(SG.ON);
//-----------Timer Init-------------
Timer2_Init();
//Start Timer with overflow interrupts
Timer2_Start();
}
int main(void)
{
//Initialize
Main_Init();
while(1)//infinite loop
{
if (SG.flag==1)
{
GICR|=(1<<INT0);//set external interrupt to enable stop
if (SG.mode==7)
{
//Noise
do
{
R2RPORT=rand();
}while(SG.flag==1);
//set signal level to 0
R2RPORT=0x00;
//display generator OFF
Menu_Update(SG.ON);
//stop external interrupt
GICR&=~(1<<INT0);
//start timer menu active
Timer2_Start();
}
/* else if (SG.mode==6)
{
//freq step
while((SG.flag==1))
{
//not implemented
CopyStringtoLCD(NA, 0, 1 );
}
//set signal level to 0
R2RPORT=0x00;
//display generator OFF
Menu_Update(SG.ON);
GICR&=~(1<<INT0);//|(1<<INT1);//stop external interrupt
//start timer menu active
Timer2_Start();
}*/
else if (SG.mode==8)
{
//High speed signal
Timer1_Start(SG.HSfreq);
while((SG.flag==1))
{
//not implemented
CopyStringtoLCD(MNON, 13, 1 );
}
Timer1_Stop();//timer off
//set HS pin to LOW
HSPORT&=~(1<<HS);
//display generator OFF
Menu_Update(SG.ON);
GICR&=~(1<<INT0);//|(1<<INT1);//stop external interrupt
//start timer menu active
Timer2_Start();
}
else
{
//start DDS
Signal_OUT(SIGNALS[sG.mode],
 (uint8_t)((uint32_t)SG.acc>>16),
 (uint8_t)((uint32_t)SG.acc>>8),
 (uint8_t)SG.acc);
//set signal level to 0
R2RPORT=0x00;
//display generator OFF
Menu_Update(SG.ON);
GICR&=~(1<<INT0);//|(1<<INT1);//stop external interrupt
//start timer menu active
Timer2_Start();
}
}
}
return 0;
}

ошибка section .MySection1 loaded at [000016ce,000017cd] overlaps section .data loaded at [000016ce,000016f5]

Подскажите пожалуйста,где посмотреть, по какой причине он так записывает в память.

Гуглила, ничего толкого не нашла.

Заранее спасибо.

Share this post


Link to post
Share on other sites

Изготовление 2-х слойных плат от 2$, а 4-х слойных от 5$!

Быстрое изготовление прототипа платы всего за 24 часа! Прямая доставка с нашей фабрики!

Смотрите видео о фабрике JLCPCB: https://youtu.be/_XCznQFV-Mw

Посетите первую электронную выставку JLCPCB https://jlcpcb.com/E-exhibition чтобы получить купоны и выиграть iPhone 12, 3D-принтер и так далее...

Безмостовые ККМ для 99% КПД!

Схема коррекции коэффициента мощности (ККМ) на основе так называемого «тотемного столба» (Totem Pole) обладает минимально возможными потерями и потенциально может обеспечить самые жесткие требования к энергоэффективности источников питания. Компания Wolfspeed представляет референсную разработку – плату ККМ CRD-02AD065N на базе собственных карбид-кремниевых MOSFET и диодов с наилучшими в отрасли характеристиками.

Подробнее

Предположительно не хватает памяти. Для эксперимента удалите две трети данных из mysection, и посмотреть, исчезнет ли ошибка или нет. Могут быть другие причины. Разумеется с удалённой частью массива даже если скомпилируется, работать неизвестно как будет.

Ещё как вариант, перекрытие блоков:

section .MySection1 loaded at [000016ce,000017cd] overlaps section .data loaded at [000016ce,000016f5]

секция MySection1, загруженная в адреса 16ce-17cd, перекрывает секцию .data, загруженную на адреса 16се-16f5.

MySection1 вот здесь

const uint8_t expwave[] __attribute__ ((section (".MySection1")))= //exp wave
{
0x00,0x09,0x12,0x1B,0x23,0x2c,0x34,0x3c,0x43,0x4B,0x52,0x59,0x60,0x67,0x6E,0x74,
0x7A,0x80,0x86,0x8C,0x91,0x97,0x9C,0xA1,0xA6,0xAA,0xAF,0xB3,0xB8,0xBC,0xC0,0xC3,
0xC7,0xCB,0xCE,0xD1,0xD4,0xD7,0xDA,0xDD,0xE0,0xE2,0xE4,0xE7,0xE9,0xEB,0xED,0xEF,.............

А секцию .data не видать что-то в коде.

Edited by tcoder

Share this post


Link to post
Share on other sites

Гибридные IGBT - сила Si и SiC в одном корпусе!

Компания Infineon представила новые гибридные IGBT-транзисторы на 650 В, которые сочетают в себе преимущества технологий TRENCHSTOP и CoolSiC. Использование SiC-диода Шоттки позволяет значительно расширить возможности IGBT и снизить уровень энергии, необходимой для включения транзистора (Eon), а также уменьшить потери на переключение.

Подробнее

Секция .data является стандартной судя по всему. Значит проблема скорее всего с объявлением секции .MySection1, ибо адреса перекрываются.... может есть смысл её на .data переименовать? Как вариант... Тогда весь блок данных будет по идее в .data загружен, конфликтовать будет нечему.

Share this post


Link to post
Share on other sites

Вебинар «Параметры выше, цена ниже. Обновление в линейке AC/DC- и DC/DC-преобразователей MORNSUN» (26.01.2021)

Приглашаем 26 января на бесплатный вебинар, посвящённый преимуществам и отличиям новых источников питания и DC/DC-преобразователей Mornsun. На вебинаре будут рассмотрены изолированные и неизолированные DC/DC-преобразователи последнего, четвертого, поколения (R4) и компактные модульные источники питания второго и третьего поколений (семейства LS/R3 и LD/R2) на плату. Рассмотрим новую группу продукции – встраиваемые источники питания в кожухе.

Подробнее

Guest Anna

вариант неплохой, но к сожалению ошибка ignoring changed section attributes for .data говорит что нельзя туда записывать ту матрицу

Share this post


Link to post
Share on other sites
Guest Anna

Предположительно не хватает памяти. Для эксперимента удалите две трети данных из mysection, и посмотреть, исчезнет ли ошибка или нет. Могут быть другие причины. Разумеется с удалённой частью массива даже если скомпилируется, работать неизвестно как будет.

Ещё как вариант, перекрытие блоков:

section .MySection1 loaded at [000016ce,000017cd] overlaps section .data loaded at [000016ce,000016f5]

секция MySection1, загруженная в адреса 16ce-17cd, перекрывает секцию .data, загруженную на адреса 16се-16f5.

MySection1 вот здесь

const uint8_t expwave[] __attribute__ ((section (".MySection1")))= //exp wave
{
0x00,0x09,0x12,0x1B,0x23,0x2c,0x34,0x3c,0x43,0x4B,0x52,0x59,0x60,0x67,0x6E,0x74,
0x7A,0x80,0x86,0x8C,0x91,0x97,0x9C,0xA1,0xA6,0xAA,0xAF,0xB3,0xB8,0xBC,0xC0,0xC3,
0xC7,0xCB,0xCE,0xD1,0xD4,0xD7,0xDA,0xDD,0xE0,0xE2,0xE4,0xE7,0xE9,0xEB,0xED,0xEF,.............

А секцию .data не видать что-то в коде.

удалить часть данных не вариант, а то что проблемы связанны с нехваткой памяти, это да,если ставить при компиляции другой МК,то там уже ошибки лишь с нераспознаванием пары команд. Но данный код заточен под схему именно с atmega16. сейчас он конечно изменен, но основное осталось нетронутым

Share this post


Link to post
Share on other sites
Guest Anna

а под сполер что убрать не судьба на всю страницу растянул

Спасибо за замечание, учту в следующий раз

Share this post


Link to post
Share on other sites

А если вот эту часть совсем удалить?

__attribute__ ((section (".MySection1")))

Может кто поопытнее ответит. Кто-то же должен был с этим столкнуться. Ещё желательно строку с ошибкой целиком копировать, а не только её смысловую часть.

*просто непонятно, почему для этого блока данных используется отдельная секция памяти, декларации которой кстати не видать в коде. Насколько мне известно, что атрибуту section нужно подавать заранее задекларированную секцию. И собственно использование самого этого массива в коде тоже не видать. Всё либо в инклудах...

Как вариант, попробуйте изучить неизменённый проект, там же всё рабочее, как я понимаю)

Edited by tcoder

Share this post


Link to post
Share on other sites
Guest Anna

А если вот эту часть совсем удалить?

__attribute__ ((section (".MySection1")))

Может кто поопытнее ответит. Кто-то же должен был с этим столкнуться. Ещё желательно строку с ошибкой целиком копировать, а не только её смысловую часть.

Спасибо,это помогло, но вот корректно ли это. Будем испытывать, спасибо Вам.

Share this post


Link to post
Share on other sites

Испытайте. Разгадка заключается только в том, почему это в отдельную секцию было вынесено, и какой области памяти она собственно относится.... насколько мне известно, там не к каждой области можно идентично обращаться. Но судя по всему всё это должно к SRAM относится (раз конфликт возник). По идее должно прокатить. Отпишитесь о результатах испытаний по возможности. :)

Share this post


Link to post
Share on other sites
Guest Anna

Испытайте. Разгадка заключается только в том, почему это в отдельную секцию было вынесено, и какой области памяти она собственно относится.... насколько мне известно, там не к каждой области можно идентично обращаться. Но судя по всему всё это должно к SRAM относится (раз конфликт возник). По идее должно прокатить. Отпишитесь о результатах испытаний по возможности. :)

в отделюную секцию вынесено наверное,для простоты работы в дальнейшем, так вроде отработало нормально и в файле с map расширением все отобразилось и записалось после уже секции .data

Share this post


Link to post
Share on other sites

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
Sign in to follow this  

  • Сообщения

    • Помогите опознать транзистор, поиск в интернете не дал результатов. Маркировка N65KAE.
    • Возможно что еще проблема в библиотеках. Какая-то из них разрослась в новой версии и места уже не хватает.
    • Это всё-таки не техническая наука. Наверное, ближе к формальной, как и математика. Я разговаривал с математиком. Он кроме математики больше ничем не интересуется. Но это было ещё до вброса о лунной афере. Химики тоже нифига ничего не знают ни о космосе, ни о Аполлоне, хотя это естественная наука.  А вот люди инженерных профессий, если даже ничего и  не слышали о лунных фальсификациях, то очень быстро ориентируются в предоставленной информации противоборствующих сторон и разоблачают сторонников лунной аферы. Я для этого прикидывался дилетантом и выкладывал самые распространенные "факты" обмана, с просьбой разобраться и разьяснить положение дел. Как правило, почти никто не вникал в тонкости предоставленной информации от НАСА. Все довольно быстро заостряли своё внимание и замечали фальшивки из длинного списка  "фактов обмана" и после двух - трех разоблаченных фейковых доводов, остальные уже не рассматривали, вынося окончательный вердикт. ))  Среди астрономов вообще нет "немогликов". И нет таких, кто бы не знал о полете Аполлона с высадкой на Луну. Ну это и понятно, почему. Я утверждал именно о вранье, а не о заблуждении.  А какое может быть у наших  специалистов заблуждение по Аполлону??? Это люди, далекие от космонавтики могут в чем то заблуждаться, а у наших академиков и докторов подобные заблуждения исключены. Точно!  Это философское словечко встречается ещё и в математике.   Да какая разница, имела или не имела редакционная коллегия полномочий выступать авторами ?????  Ты хочешь сказать, что в этой книге, отредактированной академиками и докторами, описана конструкция Сатурна,  Аполлона, которые не летали на Луну и ровера, который не бороздил просторов её поверхности??    Остальное, чистой воды демагогия. Это не моё. В книге имеются все ссылки на литературу.
    • Мдя... ИИ не обманешь. Любимый вами Яндекс видимо хорошо вас изучил и выдаёт то, что вам действительно надо. Смиритесь и не дёргайтесь.
    • Питать сетевую ламповую радиолу от батареек - глупость и утопия. Так как аутентичный внешний вид уже похерен  (), то никакой антикварной ценности аппарат не представляет. Поэтому предлагаю следующее: Найти на месте специалиста с руками и головой, который удалит из неё ламповое шасси и внедрит вместо него схему современного тюнера с усилителем, которая потребляет в десятки раз меньше энергии, да и ловит радиостанции куда лучше. Органы управления и переднюю панель при этом сохранить. Заодно и внутри куча места освободится, хоть автомобильный аккумулятор можно будет засунуть.

  • 4-х контактный переключатель, 2 шт.

  • Similar Content

    • By Обычный Человек
      Микроконтроллер ATmega328p, внешний кварц 16МГц. Компилятор avr-gcc с оптимизацией O1

      Написал код для управление шаговым двигателем. Работает так: требуемая скорость задается переменной STP1_ReqSpeed, дальше с частотой 100Гц срабатывает таймер TIM0, который высчитывает с какой частотой надо подавать сигналы на вход шагового драйвера. TIM1 работает в режиме частотно импульсной модуляции и по прерыванию меняет значение пина на противоположное.

      Управление работает, скорость регулируется, но по какой то причине случаются пропуски шагов. Чаще всего во время ускорения. Количество пропусков от 0 до 4, обычно 2-3, длятся 32мс.

      Из кода вырезал неиспользуемое. Заменить прерывания на аппаратный ШИМ возможности нет. Как убрать эти пропуски?
      Осциллограммы:
       
       
    • By Артур Измаилов
      1.Создать схему в которой два светодиоды загораются в следующей последовательности:  1 и 2, 2 и 3, 3 и 4, …, 15 и 16, 1 и 2 и т.д. (т.е. создается эффект движения двух светодиодов).
      Дано условие выше. Решение задачи нужно представить в Proteus. Код для программирования пишу в AtmelStudio 7. Схему собрал в Proteus. Вывел 16 светодиодов через 2 порта (Порт B и Порт D). МК использовал ATMEGA 8 вариации в корпусе DIP с 28 ножками (SPDIL28). 
      До этого смог написать схему, чтобы работали светодиоды в последовательности 1.2.3.4.5....16.1.2.3.4 и тд. Делал через оператор FOR. Однако с этим кодом начались проблемы. Помогите пожалуйста. 
      Нижу представил изображение кода. 
      Заранее спасибо!
       

    • By Lisitsin
      Собираем компьютер ZX Spectrum на микроконтроллерах AVR своими руками!
      Проект открытый, все исходники и информация проекта по ссылке
      https://yadi.sk/d/9S2S0ZmNqsLykQ
      Проект печатной платы выполнен в PCAD-2006, программное обеспечение разработано в AVRStudio  4b401
      Здесь отвечу на все возникающие вопросы и помогу со сборкой и запуском
    • By O5-14
      По поводу этого https://cxem.net/mc/mc220.php девайса. Как напоминалка паролей думал сделать, только в моих краях 1604 нету( Под wg12864 нет случаем модификации ? 
      И что такое значит "Текстовые файлы должны быть в обычном txt формате и без форматирования" - первая часть понятна. А без форматирования ? Одна длинная строка ? Пробелы-то хоть можно ?
    • By Karl-Ieronim
      Коллеги, всем привет. 
      Увидел вот такой проект. 
      Несмотря на явную привлекательность что-то совсем мало повторивших. 
      Может кто-то из завсегдатаев форума делал этот проект? 
      Интересует ваше мнение: хочу повторить, но не силен в программировании, поэтому беспокоюсь на счёт подводных камней с которыми не смогу справиться. 
×
×
  • Create New...