Oberon space
General Category => Общий раздел => Тема начата: valexey от Август 10, 2012, 05:37:50 pm
-
Это из мира программирования под микроконтроллеры (в основном, хотя и на PC такой код есть).
Итак, рассмотрим какой-нибудь типичный микроконтроллер, ну например msp430g2452 (http://www.ti.com/product/msp430g2231). У него ОЗУ (RAM) 256 байт, замечу что в эта RAM на все - и на стек тоже, и на глобальные переменные (которые можно менять) и на кучу. На все. При этом у этого микроконтроллера аж целых 8 Кб Flash (1024*8 = МНОГО!). Flash во время работы писать нельзя (точнее можно, но это о-очень медленно и flash от этого быстро сдохнет), зато можно читать на той же скорости что и RAM, также у микроконтроллера плоское адресное пространство - и RAM и этот Flash лежат в едином адресном пространстве (и кто где кончается и начинается определить, по сути нельзя, не попытавшись туда что-то записать).
Собственно программа пишется во Flash и прямо оттуда исполняется, в ОЗУ она не грузится.
Очень часто возникает необходимость иметь довольно большие (сотни байт) массивы и другие структуры данных содержимое которых полностью известно на этапе компиляции (простейший пример с которым я сталкивался лично - массив коэффициентов для FIR-фильтра (FIR == КИХ)) и во время исполнение программы их модификация не требуется. В RAM это все пихать глупо, да и не поместится. Им самое место во Flash'e.
Внимание вопрос - как такие структуры данных оформить в Обероне?
В Си и С++ с этим проблем нет (я знаю как), а как в Обероне - не знаю.
-
в какой конкретной реализации?
-
Внимание вопрос - как такие структуры данных оформить в Обероне?
В Си и С++ с этим проблем нет (я знаю как), а как в Обероне - не знаю.
А в чём проблема объявить эти массивы и структуры константами?
В тех же сях для мелкоконтроллеров часто вводятся расширения -- модификаторы области памяти data/idata/xdata или просто прагмы с указанием адреса, по которому начинает располагаться переменная/константа.
Или речь о том, как описать такой массив? Нет конструкторов массивов типа как в сях { 1, 2, 3 } ?
ну так добавить и дело с концом )))
-
в какой конкретной реализации?
Насколько я знаю, пока нет оберонов под msp430. Поэтому просто речь о языке. Язык думаю стоит рассматривать Oberon-07/12.
Я посмотрел Astrobe - там вроде бы решения подобных проблем не предлагают (но оно и понятно - там ну очень жирные микроконтроллеры поддерживаются, другие не поддерживаются).
Рассмотрю любые предложения, в том числе и расширизмы языка.
-
Внимание вопрос - как такие структуры данных оформить в Обероне?
В Си и С++ с этим проблем нет (я знаю как), а как в Обероне - не знаю.
А в чём проблема объявить эти массивы и структуры константами?
В тех же сях для мелкоконтроллеров часто вводятся расширения -- модификаторы области памяти data/idata/xdata или просто прагмы с указанием адреса, по которому начинает располагаться переменная/константа.
Или речь о том, как описать такой массив? Нет конструкторов массивов типа как в сях { 1, 2, 3 } ?
ну так добавить и дело с концом )))
В Обероне нет константных массивов и рекордов тоже нет.
-
В Обероне нет константных массивов и рекордов тоже нет.
И это -- его фатальный недостаток, делающий его непригодным для практического использования без расширений ))))
-
В Обероне нет константных массивов и рекордов тоже нет.
И это -- его фатальный недостаток, делающий его непригодным для практического использования без расширений ))))
Не, ну можно конечно руками (в каком-нибудь FAR'e) в hex-файл вбить нужные данные, а в рантайме завести указатель нужного типа и уже через SYSTEM подправить его содержимое чтобы он указывал на начало объекта во Flash'e. Но по моему, это как-то не слишком безопасно и не особо удобно.
-
Или речь о том, как описать такой массив? Нет конструкторов массивов типа как в сях { 1, 2, 3 } ?
ну так добавить и дело с концом )))
Именно так. До кучи еще сделать возможность декларировать по какому адресу.
-
Или речь о том, как описать такой массив? Нет конструкторов массивов типа как в сях { 1, 2, 3 } ?
ну так добавить и дело с концом )))
Именно так. До кучи еще сделать возможность декларировать по какому адресу.
По какому адресу - это уже существенно другая задача (по крайней мере из моего не шибко богатого опыта). И решать её, видимо, нужно другими средствами.
-
Не, ну можно конечно руками (в каком-нибудь FAR'e) в hex-файл вбить нужные данные, а в рантайме завести указатель нужного типа и уже через SYSTEM подправить его содержимое чтобы он указывал на начало объекта во Flash'e. Но по моему, это как-то не слишком безопасно и не особо удобно.
Отцы-основатели примерно так и делают - разрабатывают структуры данных, наполняют, пишут тулзовину, которая эти данные сбрасывает в файл в бинарном формате, а затем этот файл используют.
И этот геморрой по причине отсутствия константных массивов/записей и/или инициализаторов
-
До кучи еще сделать возможность декларировать по какому адресу.
В новом компиляторе в А2 такая возможность уже есть. С учетом, что в логах на свн проскакивало что-то про микроконтроллер чьей-то 510-й серии, то там уже более приближено к реалиям жизни
-
в общем, я думаю, что это должен быть инициализатор, что позволяет разместить данные на этапе компиляции
-
До кучи еще сделать возможность декларировать по какому адресу.
В новом компиляторе в А2 такая возможность уже есть. С учетом, что в логах на свн проскакивало что-то про микроконтроллер чьей-то 510-й серии, то там уже более приближено к реалиям жизни
А как это выглядит?
-
А как это выглядит?
как-то так
VAR
test {FIXED(1000H)}: ARRAY OF CHAR;
PROCEDURE {NOPAF, FIXED(401000H)} EntryPoint;
но там что-то ещё было, искать надо
у этих компиляторов существенный недостаток - полное отсутствие документации