Amper25 0 7 февраля, 2009 Опубликовано 7 февраля, 2009 · Жалоба Есть AVR у которого с помощью интерфейса внешней SRAM организован доступ так сказать к "периферии". То есть, для обращения к этой "периферии", надо выполнять LDS/STS с адресным пространоством external SRAM. В asm проблем нет, просто пишем нечто вроде STS ADDR,R16 ... и все. А как заставить GCC обратится к такой-то конкретной ячейке памяти, при условии что эта ячейка находится во внешней SRAM? А самой этой SRAM на самом деле нет. То есть нельзя линкеру сообщать что есть внешняя SRAM, чтобы он туда не запихал стек, HEAP или еще что нибудь. Делал давно подобное для IAR+ARM, но железно не могу вспомнить как именно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MAXvaLL 0 7 февраля, 2009 Опубликовано 7 февраля, 2009 · Жалоба Есть AVR у которого с помощью интерфейса внешней SRAM организован доступ так сказать к "периферии". То есть, для обращения к этой "периферии", надо выполнять LDS/STS с адресным пространоством external SRAM. В asm проблем нет, просто пишем нечто вроде STS ADDR,R16 ... и все. А кто мешает сделать функции rdp(...) и wrp(...), в которых бутет асемблерная вставка? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Amper25 0 7 февраля, 2009 Опубликовано 7 февраля, 2009 · Жалоба Не, был метод попроще, что то вроде: *(0xFFC0) = 125; Но не могу впомнить и найти исходники. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MAXvaLL 0 7 февраля, 2009 Опубликовано 7 февраля, 2009 · Жалоба Не, был метод попроще, что то вроде: *(0xFFC0) = 125; Но не могу впомнить и найти исходники. Не, так в си нельзя вроде. Если досуп побайтовый, то примерно так... uchar* P; ... P = (uchar*)0xFFC0; *P = 125; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
NullPointer 0 7 февраля, 2009 Опубликовано 7 февраля, 2009 · Жалоба // External SRAM page configuration: // 1100h - 7FFFh / 8000h - FFFFh // Lower page wait state(s): None // Upper page wait state(s): 1r/w void XMEM_Initialize(void) { XMCRA = _BV(SRL2); MCUCR |= (_BV(SRE) | _BV(SRW10)); } void WriteByteAtAddress(WORD address, BYTE value) { BYTE *addr; addr = (BYTE *) address; *addr = value; } BYTE ReadByteAtAddress(WORD address) { BYTE *addr; addr = (BYTE *) address; return (*addr); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Amper25 0 7 февраля, 2009 Опубликовано 7 февраля, 2009 · Жалоба А, примерно так и предполагал. Всем спасибо за помощь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 7 февраля, 2009 Опубликовано 7 февраля, 2009 · Жалоба void WriteByteAtAddress(WORD address, BYTE value) { BYTE *addr; addr = (BYTE *) address; *addr = value; } BYTE ReadByteAtAddress(WORD address) { BYTE *addr; addr = (BYTE *) address; return (*addr); } А для чего процедуры-то? Ведь так очень оверхед большой получается. Уж лучше через #define или со static inline. #define TOUCH_BYTE(ADDRESS) (*(unsigned char*)(ADDRESS)) #define WRITE_BYTE(ADDRESS,DATA) do {TOUCH_BYTE(ADDRESS) = (DATA);} while (0) #define READ_BYTE(ADDRESS) TOUCH_BYTE(ADDRESS) // и далее в программе unsigned char a; a = TOUCH_BYTE(0x0100); // читаем TOUCH_BYTE(0x0100) = 45; // пишем Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
NullPointer 0 7 февраля, 2009 Опубликовано 7 февраля, 2009 · Жалоба А для чего процедуры-то? Ведь так очень оверхед большой получается. Уж лучше через #define или со static inline Вы правы, моя ошибка, надо было и хедер показать. Там inline ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 7 февраля, 2009 Опубликовано 7 февраля, 2009 · Жалоба BYTE *addr; addr = (BYTE *) address; *addr = value; Функции :(, макросы :(, инлайны .... *(BYTE *)address = value; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
NullPointer 0 7 февраля, 2009 Опубликовано 7 февраля, 2009 (изменено) · Жалоба Если говорить о стиле и точности, то стоит добавить const: *(unsigned char * const)(0x8000) = 0x01; Оптимизатор же все вышеизложенное сводит одинаково к: LDI R24,0x01 Load immediate STS 0x8000,R24 Store direct to data space Какой вариант использовать зависит исключительно от ситуации. Изменено 7 февраля, 2009 пользователем SysRq Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться