Сб окт 13, 2018 22:51:40
PROGRAMMER=stk500v2
PORT=com7
BitClock=1
Ср дек 19, 2018 12:17:02
Вт янв 29, 2019 08:22:09
Сб фев 02, 2019 22:39:15
.text :
{
*(.vectors)
KEEP(*(.vectors))
/* For data that needs to reside in the lower 64k of progmem. */
*(.progmem.gcc*)
/* PR 13812: Placing the trampolines here gives a better chance
that they will be in range of the code that uses them. */
. = ALIGN(2);
__trampolines_start = . ;
/* The jump trampolines for the 16-bit limited relocs will reside here. */
*(.trampolines)
*(.trampolines*)
__trampolines_end = . ;
/* avr-libc expects these data to reside in lower 64K. */
*libprintf_flt.a:*(.progmem.data)
*libc.a:*(.progmem.data)
*(.progmem*)
. = ALIGN(2);
/* For future tablejump instruction arrays for 3 byte pc devices.
We don't relax jump/call instructions within these sections. */
*(.jumptables)
*(.jumptables*)
/* For code that needs to reside in the lower 128k progmem. */
*(.lowtext)
*(.lowtext*)
__ctors_start = . ;
*(.ctors)
__ctors_end = . ;
__dtors_start = . ;
*(.dtors)
__dtors_end = . ;
KEEP(SORT(*)(.ctors))
KEEP(SORT(*)(.dtors))
/* Внедрение моих секций для таблиц */
__my_tbl_start = __dtors_end ;
*(.my_table)
__my_tbl_end = . ;
KEEP(SORT(*)(.my_table))
/* Конец моих секций для таблиц */
extern int __my_tbl_start;
extern int __my_tbl_end;
printf("%04X %04X", __my_tbl_start, __my_tbl_end);
0x0000069e __my_tbl_start = .
*(.my_table)
.my_table 0x0000069e 0x2 ./alarm-main.o
0x0000069e _A0_DATA28
.my_table 0x000006a0 0x2 ./alarm.o
0x000006a0 _A0_DATA22
.my_table 0x000006a2 0x2 ./timers.o
0x000006a2 _A0_DATA121
0x000006a4 __my_tbl_end = .
SORT(*)(.my_table)
Сб фев 02, 2019 22:51:39
.my_table :
{
. = ALIGN(4);
__my_tbl_start = .;
*(.my_table*)
__my_tbl_end = .;
} > MY_TABLE
Сб фев 02, 2019 22:58:33
Вс фев 03, 2019 07:26:43
Вс фев 03, 2019 08:08:52
typedef struct{
void (*funcptr)(char *);
const __flash char cmd[];
} item_t;
const __flash char str1[] = "CMD1";
const __flash char str2[] = "CMD2";
const __flash char str3[] = "CMD3";
static void func1(void){
}
static void func2(void){
}
static void func3(void){
}
const __flash item_t table[] = {
{.funcptr = func1, .cmd = str1},
{.funcptr = func2, .cmd = str2},
{.funcptr = func3, .cmd = str3},
}
#define tbl_entry(s) static const __flash char s[] = # s ; \
static void CONCAT(func_, s)(void); \
static const __flash __attribute__((section(".my_table"))) item_t CONCAT(item_, s) = {.funcptr = CONCAT(func_, s), .cmd = s}; \
static void CONCAT(func_, s)(void)
tbl_entry(CMD1){
// обработка команды
}
Вс фев 03, 2019 09:08:09
Так-то да, но в случае прерываний задача попроще. Всё-таки имена этих функций-прерываний фиксированы. И Вы, да, помещаете их где угодно в коде, но назвать "от балды" их не можете.ARV писал(а):в avr-gcc имеется возможность в любом месте в любом модуле описать обработчик прерывания, и они все из разных мест будут собраны линкером в одну таблицу!
Вс фев 03, 2019 09:30:11
Вс фев 03, 2019 15:55:22
Мои представления были не точны.Kavka писал(а):Думается в программе именно к этим символам доступ не получить никак
Вс фев 03, 2019 17:34:39
Пн фев 04, 2019 16:55:10
Для этого, ведь, тут и тусуемсяARV писал(а):благодарю за желание помочь я уже вовсю пользуюсь этим методом - мне нравится.
Пн фев 04, 2019 19:13:03
я тут дальше продолжаю думать в направлении секций памяти... по-моему, отличные перспективы автоматизации рутины открываются!Kavka писал(а):Для этого, ведь, тут и тусуемся
Пт апр 12, 2019 11:35:36
Пт апр 12, 2019 11:47:36
Пт май 17, 2019 20:08:59
unsigned char butt_on_state=WAVE_ALW_ON_LOW,
butt_off_state=WAVE_ALW_OFF_LOW,
st_t=0;
int tmrLo=0, //счетчик таймера понижения яркости
tmrOff=0, //счетчик таймера включения/отключения света
tmrTun=0; //счетчик таймера настройки света
unsigned char is_tune=0, //признак того что регулируют яркость и не надо выключать свет
state_butt; //Состояние главного конечного автомата кнопки (общий для двух)
DDRA=0x00;
DDRB=0x07;
DDRD=0x01;
PORTD=0x00;
for (unsigned char i=0;i<SP_COUNT;i++) arSteps[i]=0;
TCNT0=0;
TCCR0B = (0<<CS02)|(0<<CS01)|(1<<CS00);
TIMSK |= (1<<TOIE0); // разрешаем прерывание по переполнению таймера (ШИМ)
sei();
TCNT1=0;
TCCR1B = (0<<CS12)|(0<<CS11)|(1<<CS10);
TIMSK |= (1<<TOIE1); // разрешаем прерывание по переполнению таймера
/*задержка в одну секунду что бы датчики в себя пришли*/
_delay_ms(1000);
MCUCR = (1<<ISC00)|(0<<ISC01)|(1<<ISC10)|(0<<ISC11); // прерывания по изменению уровня INT0 или INT1
GIMSK = (1<<INT0)|(1<<INT1);
state=IDLE;
state_butt=BUTTON_NOT_PRESS;
Пт май 17, 2019 21:27:53
Ср ноя 25, 2020 22:37:54
uint8_t EEMEM some_array[64];
Ср ноя 25, 2020 23:26:44
вы ошибаетесь.Andrew88 писал(а):как я понимаю, будет перезаписывать массив при каждом выполнении программы, да ещё и начиная с нулевого адреса