-
- uint8_t *origin - это указатель на RAM. Указатель на флэш сюда
запихать нельзя. Ale3000(342 знак., 18.01.2023 09:33)
- Я не настоящий сварщик, но сейчас всё работает как раз с Flash. Toчкa oпopы(334 знак., 18.01.2023 10:57)
- Позанудствую. Всем известный Cortex-M3 вполне себе Гарвард, но там
такой нелепой фигни нет. Почему все любят вешать собак на Гарвард? SciFi(1 знак., 18.01.2023 09:43, ссылка)
- Харвард он разный. Бывает уровня архитектуры шин памяти, а бывает уровня системы команд. - =AlexD=(18.01.2023 10:29)
- Место зануды тут занято VladislavS.(1 знак., 18.01.2023 10:21, ссылка)
- То есть Cortex-M3 — это модифицированных гарвард? Это прекрасно. В
этой же статье в википедии сказано, что и AVR — модифицированный
гарвард. SciFi(390 знак., 18.01.2023 10:36)
- В случае AVR адресные пространства разные. - Dingo(18.01.2023 10:46)
- 51й тоже более чем Гарвард, но компилятор кейла, например,
прекрасно разруливает сам с чем работаешь. Да, наверное с
накладными, да похер на на них - если ресурсов нема добро
пожаловать в асм. - POV(18.01.2023 10:48)
- Недавно писал кое-чего под 51, на Цэ в кейле. Таки на обмене в
250кбит/с разница между "поместить буфер в data" и "поместить буфер
в xdata" заметна невооруженным глазом. - LightElf(18.01.2023 13:08)
- это не имеет отношения к передаче указателя. тут тупо больше команд
на запись байта в паять. - POV(18.01.2023 14:47)
- Указатель - три байта вместо одного. Сильно разная разница. - LightElf(18.01.2023 14:49)
- это не имеет отношения к передаче указателя. тут тупо больше команд
на запись байта в паять. - POV(18.01.2023 14:47)
- Недавно писал кое-чего под 51, на Цэ в кейле. Таки на обмене в
250кбит/с разница между "поместить буфер в data" и "поместить буфер
в xdata" заметна невооруженным глазом. - LightElf(18.01.2023 13:08)
- 51й тоже более чем Гарвард, но компилятор кейла, например,
прекрасно разруливает сам с чем работаешь. Да, наверное с
накладными, да похер на на них - если ресурсов нема добро
пожаловать в асм. - POV(18.01.2023 10:48)
- Там всего Гарварда - отдельная шина ОЗУ чтобы из нее быстрее
работать. Однако для прогера это Фон-нейман, т.к. адресное
пространство одно. Видимо и никакой идентификации типа памяти нет
при компиляции, это уже аппаратно разруливается к чему идёт
обращение. - POV(18.01.2023 10:39)
- Ну вот и не надо полоскать доброе имя Гарварда, дабы не заводить в
дебри. Сказали бы как есть: аффтары авра приняли плохое решение,
разделив адресные пространства, и теперь все отдуваются. Причём
трубили же, что сделают проц, на который хорошо лягут си, а потом
залажали в самом интересном месте. - SciFi(18.01.2023 10:42)
- Нiт. Раздельные адресные пространства сделаны чтобы иметь отдельные
шины обращения к данным и коду программы и иметь возможность
считывать код команды параллельно с записью/чтением данных. - Boвa(19.01.2023 05:53)
- Интересно, как же Cortex-M3 проворачивает именно этот трюк с единым
адресным пространством? Наверное, какие-то волшебники его сделали. - SciFi(19.01.2023 07:59)
- Можно было и там сделать, но тогда нужен синхронизатор обращений к памяти и длительность циклов обращения к памяти будет плавающая. Ну или двухпортовую рам лепить с двумя независимыми шинами или кеш.В общем это слишком сложно для 8 битника. - Boвa(21.01.2023 08:24)
- У него длина адреса позволяет хранить признак адресного пространства прямо в указателе. - LightElf(19.01.2023 16:21)
- Интересно, как же Cortex-M3 проворачивает именно этот трюк с единым
адресным пространством? Наверное, какие-то волшебники его сделали. - SciFi(19.01.2023 07:59)
- Это для того, чтобы иметь 128К флеш и 64К озу, но при этом 16
битные указатели. Хитрый план. - =AlexD=(18.01.2023 11:11)
- Это не единственный способ получить 128К ПЗУ + 64К ОЗУ. Многие
справились с этой задачей, причём обычно лучше, чем авр. - SciFi(18.01.2023 11:16)
- А какие тут собственно варианты? Только более длинные указатели. А
это сам понимаешь, лишние накладные по тактам и по памяти. - =AlexD=(18.01.2023 11:25)
- Нет. Не делай вид, что не знаешь. Бывают короткие и длинные режимы
адресации, регистры сегментов, можно делать конфигурируемую границу
между ROM и RAM в адресном пространстве. Чипы, у которых
ROM+RAM<=64K, чем провинились? Короче, есть нормальные
решения, но кто-то поленился. - SciFi(18.01.2023 11:32)
- Разные типы указателей - это разные типы указателей, они и сейчас в AVR есть, можешь считать их разными аппаратными сегментами. Сегментная адресация х86 - это то, от чего страдало целое поколение погромиздов, и от чего отбрыкались с большим облегчением с переходом на 32 бит (хотя они никуда не делись, но их просто не используют). Собственно всё это демонстрирует, что лучше простенький 32битник чем навороченный 8/16 битник. Не получается тут большой экономии. - =AlexD=(18.01.2023 11:42)
- Нет. Не делай вид, что не знаешь. Бывают короткие и длинные режимы
адресации, регистры сегментов, можно делать конфигурируемую границу
между ROM и RAM в адресном пространстве. Чипы, у которых
ROM+RAM<=64K, чем провинились? Короче, есть нормальные
решения, но кто-то поленился. - SciFi(18.01.2023 11:32)
- А какие тут собственно варианты? Только более длинные указатели. А
это сам понимаешь, лишние накладные по тактам и по памяти. - =AlexD=(18.01.2023 11:25)
- Это не единственный способ получить 128К ПЗУ + 64К ОЗУ. Многие
справились с этой задачей, причём обычно лучше, чем авр. - SciFi(18.01.2023 11:16)
- Нiт. Раздельные адресные пространства сделаны чтобы иметь отдельные
шины обращения к данным и коду программы и иметь возможность
считывать код команды параллельно с записью/чтением данных. - Boвa(19.01.2023 05:53)
- Ну вот и не надо полоскать доброе имя Гарварда, дабы не заводить в
дебри. Сказали бы как есть: аффтары авра приняли плохое решение,
разделив адресные пространства, и теперь все отдуваются. Причём
трубили же, что сделают проц, на который хорошо лягут си, а потом
залажали в самом интересном месте. - SciFi(18.01.2023 10:42)
- В случае AVR адресные пространства разные. - Dingo(18.01.2023 10:46)
- То есть Cortex-M3 — это модифицированных гарвард? Это прекрасно. В
этой же статье в википедии сказано, что и AVR — модифицированный
гарвард. SciFi(390 знак., 18.01.2023 10:36)
- Разве там не 16-разрядные указатели? В них просто нет места, чтобы
различать RAM/ROM. - SciFi(18.01.2023 08:43)
- Могут быть и 24 битные, зависит от контроллера. - VladislavS.(18.01.2023 08:49)
- Вот что-то нашлось про __memx и 24-разрядные указатели. Но у ТС в
коде объявлен простой указатель, он может указывать только на SRAM,
ЕМНИП: SciFi(1 знак., 18.01.2023 08:56, ссылка)
- По вашей ссылке, Named-Address-Spaces, цитата: Devices belonging to avrtiny and avrxmega3... ...There is no need for language extensions like __flash or attribute progmem. The default linker description files for these devices cater for that feature and .rodata stays in flash: The compiler just generates LD* instructions, and the linker script adds core specific offsets to all .rodata symbols: 0x4000 in the case of avrtiny and 0x8000 in the case of avrxmega3. See AVR Nikolay_Po(399 знак., 18.01.2023 11:01, ссылка)
- Вот что-то нашлось про __memx и 24-разрядные указатели. Но у ТС в
коде объявлен простой указатель, он может указывать только на SRAM,
ЕМНИП: SciFi(1 знак., 18.01.2023 08:56, ссылка)
- Могут быть и 24 битные, зависит от контроллера. - VladislavS.(18.01.2023 08:49)
- В IAR, как уже писали, есть втроенные __generic указатели. Но они
не бесплатны. Старший бит такого указателя определяет на что он
указывает. И при доступе к данным по такому указателю в рантайме
каждый раз делается проверка этого бита и выбор делать доступ к
DATA или CODE. В GCC такого нет. Надо самому что-то придумывать. А
если всё равно придумывать, то лучше развести такие указатели на
этапе написания кода и компиляции. - VladislavS.(18.01.2023 08:40)
- Если я правильно понял, то для avrtiny и avrxmega3 обычный GCC умеет различать типы указателей автоматически, см. моё сообщение выше. Nikolay_Po(1 знак., 18.01.2023 11:04, ссылка)
- В IAR есть тип указателя __generic - это оно. В GCC наверное тоже что-то подобное есть. - il-2(18.01.2023 07:01)
- Не уверен, но может быть, что флеш "расположен" с этого адреса, а
потом уже пересчитывается. А вот как туда файл положить и
объяснить, в какой памяти будет - у меня нет идей. PROGMEM вроде в
атрибут раскрывается, его и задать попробовать. - Dingo(18.01.2023 04:38)
- Там разные команды для доступа используются: LD / ST для RAM, и LPM для чтения из программной, он же flash. Наверняка адресное пространство оперативки у вас не сильно велико и может статься, что старший бит можно использовать как указание читать из флеши. То есть указатель приводим к указателю на flash и по нему читаем. Костыль, но как вариант. Dingo(1 знак., 18.01.2023 10:44, ссылка)
- Разовью: написать заглушку, которая работает с RAM и с Flash, и
посмотреть дизассемблер. - Dingo(18.01.2023 07:57)
- Ассемблер можно посмотреть здесь (avr-gcc progmem.h): Nikolay_Po(1 знак., 18.01.2023 11:07, ссылка)
- Спасибо и вам за ссылку. - Dingo(18.01.2023 11:45)
- Всё так. #define PROGMEM __ATTR_PROGMEM__ => #define
__ATTR_PROGMEM__ __attribute__((__progmem__)) => typedef
int8_t PROGMEM prog_int8_t; и подобное. Память не подвела меня. - Dingo(18.01.2023 11:14)
- Спасибо. А вот как относиться к этому примечанию: "This typedef is now deprecated because the usage of the __progmem__ attribute on a type is not supported in GCC."? Получается, что в avr-gcc всё делается вручную, и сам себе злобный буратино, если не указал атрибуты и не использовал подходящие функции. А в общем GCC типы памяти учитываются автоматически, но не все ядра AVR поддерживаются. - Nikolay_Po(18.01.2023 11:33)
- Ассемблер можно посмотреть здесь (avr-gcc progmem.h): Nikolay_Po(1 знак., 18.01.2023 11:07, ссылка)
- uint8_t *origin - это указатель на RAM. Указатель на флэш сюда
запихать нельзя. Ale3000(342 знак., 18.01.2023 09:33)