![]() |
|
Модераторы: PILOT, ManiaK, Mazzi |
![]()
|
|
| ManiaK |
|
|||
![]() Homo Sapience ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1145 Регистрация: 3.8.2004 Где: ИУ5-93 Репутация: 2 Всего: 29 |
Идея такая. Для PIC'ов насколько я знаю существует только одна реализация языка Си - и она платная. Также я практически не встречал реализаций Си++ для микроконтроллеров, а некоторые из его возможностей ой как хочется иногда задействовать.
После некоторой тренировки в написании интерпретаторов языков вроде Бейска я начал потихоньку писать "нечто вроде асм с элементами Си". Параллельно я обдумывал, что нужно в этом языке, а что - лишнее (применительно к микроконтроллерному программированию). Основной удар, конечно, делаю на скорость и контроль над процессом. Где-то в конце августа предполагаю выпустить первую версию, которая будет чуть-чуть удобнее ассемблера, но как таковым Протон 1 ещё высокоуровневым языком не будет считаться. Пару дней назад к идее решил присоединиться quarz. Всю информацию по разработкам буду выкладывать здесь, надеюсь кому-нибудь будет полезно. Если у кого есть какие-то идеи, которые хотели бы увидеть в Протоне - пишите. Это сообщение отредактировал(а) ManiaK - 4.3.2008, 13:11 |
|||
|
||||
| Crait |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 244 Регистрация: 20.2.2003 Репутация: нет Всего: 1 |
Ух ты...
Поподробнее бы узнать, как это - ассемблер с элементами C. Чего мне не хватало, когда работал на асме 51 - так это автоматизации распределения памяти под переменные. |
|||
|
||||
| ManiaK |
|
||||
![]() Homo Sapience ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1145 Регистрация: 3.8.2004 Где: ИУ5-93 Репутация: 2 Всего: 29 |
На этих выходных попытаюсь оформить
По-подробней пожалуйста. |
||||
|
|||||
| setq |
|
|||
|
Unregistered |
прочёл название как "Высокоуровневый язык Питон для микроконтроллеров PIC". %)) аж дыхание перехватило. %)
(абзац. нельзя столько времени на работе проводить...) |
|||
|
||||
| ManiaK |
|
|||
![]() Homo Sapience ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1145 Регистрация: 3.8.2004 Где: ИУ5-93 Репутация: 2 Всего: 29 |
Модератор: попрошу не флеймить...
|
|||
|
||||
| ManiaK |
|
|||
![]() Homo Sapience ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1145 Регистрация: 3.8.2004 Где: ИУ5-93 Репутация: 2 Всего: 29 |
Итак. Вот примерно то, что будет в первой сборке через неделю (альфа версия).
Во-первых. Протон - не столько самостоятельный язык, сколько надстройка над ассемблером. Все программы написанные на ассемблере без проблем компилируются как протоновские с одной - на синтаксис (каждая строка кода заканчивается ';' + Си-коментарии). Вот пример программы на Протоне:
Как видно из этой демонстрационной совершенно бессмысленной программы, точка старта программы - это, отнюдь, не функция main pc при использовании команды goto - это номер строки кода (строки заканчиваются точкой с запятой, не текстовые строки имеется ввиду). В определении функции можно не указывать возвращаемый параметр если функция ничего не возвращает. Вот, вообщем и всё, что я пока напридумывал Как видно, все эти преобразования отличаются тем, что я не изобретаю свой язык, а лишь делаю надстройку над ассемблером - такая логика, как я считаю, может оказаться полезной, хотя пока я сам не вижу особого прорыва Это сообщение отредактировал(а) ManiaK - 8.8.2005, 15:35 |
|||
|
||||
| Sardar |
|
|||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 2 Всего: 317 |
ManiaK хорошая затея. Одно время разрабатывал идею макро-ассемблера для x51, но идея оказалась замученой и не выжила.
А одной из причин была как раз не переносимость. Птому как не хочеться знать где у контроллера точка входа, как реализованны прерывания и т.д. Ещё большой проблемой был вызов существующих функций/процедур, написанных на асме. Каждый человек пишет по своему, кто то любит получать аргументы в регистрах, кто то обьявляет функции без рекурсии и "бронирует" место под аргументы, кто то пользуеться стеком(чего под PIC'ом нет...). Нужна была схема, описываемая формальным языком. А затем можно было вызывать: procedure(ar1, arg2, arg3): schema(keil c); Конструкция должна разбираться в момент компиляции, потому если функция меняеться(либа компилилась другим компилером), то схему тоже нужно менять. Вообщем складывай идеи, если нужна помощь(например задокументировать твой код, мануал и т.д.), с радостью -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
|||
|
||||
| Crait |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 244 Регистрация: 20.2.2003 Репутация: нет Всего: 1 |
Программируя на ассемблере 51, достаточно затруднительно было обращаться к переменным на стеке (кстати, такой механизм - IMHO, ещё один кандидат на то, чтобы повысить "уровень" ассемблера), поэтому я обычно переменные делал статическими (статическими в смысле языка C), ну и начинались танцы с бубном - во-первых, размещением этих переменных в памяти с определённого адреса занималась кучка самопальных макросов, во-вторых, используя этот механизм, оптимально распределить память было нельзя (некоторые процедуры точно не вызывают друг друга и не активны одновременно, но память для их переменных распределяется в разных адресах, а можно бы было разделять пространство этих переменных). Потом ещё, помню, была проблема - с какого адреса начать распределять память, ибо довольно большой кусок в архитектуре 51 отведён под битовые флаги, и часть их также используется. Ещё есть регистровые банки, они, помнится, тоже могли делать область статических переменных фрагментированной. Для других архитектур всё это, возможно, не актуально. Вот ещё что было бы полезно : автоматический анализ используемых подпрограммами регистров (с учётом вызовов всех используемых в ней подпрограмм). |
|||
|
||||
| Sardar |
|
|||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 2 Всего: 317 |
ИМXО для микроконтроллеров полезны такие фичи как:
-------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
|||
|
||||
| ManiaK |
|
||||||||||||
![]() Homo Sapience ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1145 Регистрация: 3.8.2004 Где: ИУ5-93 Репутация: 2 Всего: 29 |
Именно этим мне заниматься некогда, да и не умею я. Учту Crait В pic12f675 стека как такового нет, поэтому эту идею я буду откатывать уже на нём. Только её надо доработать, передаваемые параметры для меня тоже пока проблема.
А для чего? Просто как информация кодеру?..
Если процедура от функции отличается только тем, что ничего не возвращает, то main на примере выше - процедура
У меня хитрость такая. Директива orgd перемещает каретку компилятора на нужный адрес. Допустим пишем - "orgd 0x03;". Каретка сдвинулась на третий адрес. После этого первая байтовая переменная, объявленная ниже будет лежать по адресу 0x03 (для pic12f675 это регистр STATUS). При объявлении переменной каретка сдвигается выше по адресу на размер переменной. Если мы следом объявим ещё одну байтовую переменную она будет лежать по адресу 0x04. То есть: 1. Мы не забиваем голову себе распределением переменных; если не нужно указывать конкретный адрес для каждой - указываем только для первой; 2. Мы имеем отличную возможность определять для каждой переменной свой адрес. По-моему удобно. Но для статических переменных, в динамические я пока вообще не лезу, это бы реализовать...
Да, это было бы удобно но нужно подумать как при этом не нарушить "совместимость" с асмом.
Не очень понял. Это ты про указатели?.. |
||||||||||||
|
|||||||||||||
| Crait |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 244 Регистрация: 20.2.2003 Репутация: нет Всего: 1 |
Ну да. Чтоб знать, какие регистры портятся. |
|||
|
||||
| ManiaK |
|
|||
![]() Homo Sapience ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1145 Регистрация: 3.8.2004 Где: ИУ5-93 Репутация: 2 Всего: 29 |
Это скорее функция IDE, а не компилятора. Хотя можно писать эту инфу в lst файл. |
|||
|
||||
| Sardar |
|
||||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 2 Всего: 317 |
Наоборот это функция компилятора, он должен выдать как используеться память, где ты наложил переменные друг на дружку и т.д.
Синтаксис может быть каким угодно, пусть визуально процедура от функции не отличаеться, допустим function void main(... При этом если мы пишем public int myvar=main(...) - то компиплер должен ругнуться. Вообще понятие функций в асме довольно обьёмная задача. Если весь проект компилиться одним компилятором, то все функции придерживаються одного соглашеия по вызову и возврате результата. Если же нужно поддерживать асмовский код от других, то аргументы и возвращаемые значения лежат там, где хотел программист, что плохо по определению Обычно в таких случаях пишут врапперы, но эффективно, как минимум вызов функции будет совершаться через вызов ещё одной, что потребует больше места от стека, а стек у нас не резиновый. Я когда то хотел придумать механизм схем. Схемы описывают где размещат переменные, перед вызовом "сабрутины", и где найти потом "возвращаемый результат". Затем обе схемы связываються с функцией. Представим случай, есть средненкий микроконтроллер(х51, DS80320 память внешняя), в нём "загруженна" либа с общим функционалом и кооперативным менеждером задач. Всё это написанно на асме. Контроллер читает несколько сенсоров, простенько сжимает полученную инфу и пишет на какой нибудь большой флеш. Потключен какой нибудь сетью к общей системе, если что то не ладно, отсылает сигнал тревоги. Пишем пару задачь/тредов, что будут выполнять работу. Вдруг упираемся что способ вызова твоей процедуры отличаеться от принятого в "системной" либе. Можно писать вызов на асме, но так придёться для всех функций, тогда смысла писать на "высокоуровневом" языке особо нет. Для этого нужны схемы возовов и получения результата. Функция может отдать не только один тип или массив, но и tuple, часть которого в регистрах, часть в памяти, ещё часть в стеке Вот эту идею я не развил -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
||||
|
|||||
| ManiaK |
|
|||
![]() Homo Sapience ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1145 Регистрация: 3.8.2004 Где: ИУ5-93 Репутация: 2 Всего: 29 |
А надо |
|||
|
||||
| smalcom |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 494 Регистрация: 16.10.2004 Где: Dnepr Репутация: 4 Всего: 7 |
а про GCC забыли? Я им пользуюсь под AVR, но под PIC его тоже можно скомпилить. -------------------- What DA F...??? |
|||
|
||||
![]()
|
| Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)" | |
|
|
На данный раздел помимо Правил форума распространяются текже следующие правила:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, PILOT, ManiaK, UniBomb, Mazzi. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Микроконтроллеры (MCU) и микропроцессоры (MPU) | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |