OberonCore https://forum.oberoncore.ru/ |
|
Компилятор Oberon → ARMv6-M, ARMv7E-M https://forum.oberoncore.ru/viewtopic.php?f=137&t=5232 |
Страница 6 из 9 |
Автор: | Alexander Shiryaev [ Вторник, 12 Январь, 2016 00:32 ] |
Заголовок сообщения: | Re: Компилятор Oberon → ARMv6-M, ARMv7E-M |
Иван Денисов писал(а): Свой код бортового и управляющего модулей прилагаю к сообщению. Упростил твою бортовую программу:
Код: MODULE IvanTestDAC1; IMPORT SYSTEM, ARMv7M := MicroARMv7M, MF := MicroMemFormatters, MCU := MicroSTM32F405, PinCfg := MicroSTM32F405PinCfg, Sys := MicroSTM32F405System, TP3 := MicroSTM32F405TrimblePort3, PeriodicTimer := IvanSysTick0; CONST periodicTimerFreq = 1024; (* Hz *) nChannels = 2; VAR cnt0: INTEGER; both: BOOLEAN; channels: ARRAY nChannels OF RECORD timeDAC: INTEGER; v, ts, te: INTEGER END; PROCEDURE SetDAC (chn, x: INTEGER); BEGIN ASSERT(chn DIV 2 = 0); IF chn = 0 THEN SYSTEM.PUT(MCU.DACDHR12R1, x) ELSE SYSTEM.PUT(MCU.DACDHR12R2, x) END END SetDAC; PROCEDURE Receive3 (id: CHAR; a: ARRAY OF CHAR; len: INTEGER); VAR ok, echo: BOOLEAN; v, t, r: INTEGER; BEGIN echo := FALSE; IF (id = 11X) OR (id = 12X) THEN IF len = 8 THEN r := 0; MF.ReadIntLE(a, r, v); MF.ReadIntLE(a, r, t); IF (v >= 0) & (v < 4096) THEN IF id = 11X THEN SetDAC(0, v); channels[0].timeDAC := t ELSE SetDAC(1, v); channels[1].timeDAC := t END; echo := TRUE END END ELSIF id = 15X THEN IF len = 24 THEN r := 0; MF.ReadIntLE(a, r, channels[0].v); MF.ReadIntLE(a, r, channels[0].ts); MF.ReadIntLE(a, r, channels[0].te); MF.ReadIntLE(a, r, channels[1].v); MF.ReadIntLE(a, r, channels[1].ts); MF.ReadIntLE(a, r, channels[1].te); both := TRUE; echo := TRUE END END; IF echo THEN TP3.Send(id, SYSTEM.ADR(a), len, ok) END END Receive3; PROCEDURE OnTimer; VAR over1, over2: BOOLEAN; chn: INTEGER; PROCEDURE Test (chn: INTEGER): BOOLEAN; VAR over: BOOLEAN; BEGIN over := FALSE; IF channels[chn].ts > 0 THEN DEC(channels[chn].ts) ELSIF channels[chn].ts = 0 THEN DEC(channels[chn].ts); SetDAC(chn, channels[chn].v) ELSE IF channels[chn].te > 0 THEN DEC(channels[chn].te) ELSIF channels[chn].te = 0 THEN DEC(channels[chn].te); SetDAC(chn, 0); over := TRUE ELSE over := TRUE END END; RETURN over END Test; BEGIN IF both THEN over1 := Test(0); over2 := Test(1); both := ~ (over1 & over2) ELSE chn := nChannels; REPEAT DEC(chn); IF channels[chn].timeDAC > 0 THEN DEC(channels[chn].timeDAC) ELSIF channels[chn].timeDAC = 0 THEN SetDAC(chn, 0); DEC(channels[chn].timeDAC) END UNTIL chn = 0; INC(cnt0); IF cnt0 MOD periodicTimerFreq = 0 THEN SYSTEM.PUT(MCU.GPIODBSRR, {12 + 16}) (* !~PD12 *) ELSIF cnt0 MOD periodicTimerFreq = periodicTimerFreq DIV 2 THEN SYSTEM.PUT(MCU.GPIODBSRR, {12}) (* !PD12 *) END END END OnTimer; PROCEDURE MainLoop; BEGIN REPEAT IF PeriodicTimer.OnTimer() THEN OnTimer END; TP3.Receive(Receive3); ARMv7M.WFI UNTIL FALSE END MainLoop; PROCEDURE Init; VAR chn: INTEGER; PROCEDURE InitLED; BEGIN PinCfg.Configure(PinCfg.D, 12, PinCfg.output, PinCfg.pushPull, PinCfg.low, PinCfg.noPull, 0) END InitLED; PROCEDURE InitDAC; VAR x: SET; BEGIN (* enable GPIOA = 0 *) SYSTEM.GET(MCU.RCCAHB1ENR, x); SYSTEM.PUT(MCU.RCCAHB1ENR, x + {0}); (* enable DAC clock, DACEN = 29 *) SYSTEM.GET(MCU.RCCAPB1ENR, x); SYSTEM.PUT(MCU.RCCAPB1ENR, x + {29}); (* PA4, PA5: AIN *) SYSTEM.GET(MCU.GPIOAMODER, x); SYSTEM.PUT(MCU.GPIOAMODER, x - {8..11}); (* Disable buffer BOFF1 = 1, BOFF2 = 16 *) SYSTEM.GET(MCU.DACCR, x); x := x - {1, 17}; (* Reset TEN1 = 2 and TEN2 = 18 *) x := x - {2, 18}; SYSTEM.PUT(MCU.DACCR, x); (* Enable EN1 = 0, EN2 = 16 *) SetDAC(0, 0); SetDAC(1, 0); SYSTEM.GET(MCU.DACCR, x); SYSTEM.PUT(MCU.DACCR, + {0, 16}) END InitDAC; BEGIN both := FALSE; cnt0 := 0; chn := nChannels; REPEAT DEC(chn); channels[chn].timeDAC := 0 UNTIL chn = 0; InitLED; InitDAC; TP3.Init(19200, TP3.parityNone); PeriodicTimer.Init(periodicTimerFreq) END Init; BEGIN Init; MainLoop END IvanTestDAC1. Код: MODULE IvanSysTick0;
(* Alexander Shiryaev, 2015.03 SysTick timer for producing periodic events *) IMPORT SYSTEM, ARMv7M := MicroARMv7M, Sys := MicroSTM32F405System; VAR flag: BOOLEAN; PROCEDURE* SysTickIntHandler; BEGIN flag := TRUE END SysTickIntHandler; PROCEDURE Init* (freq: INTEGER); CONST delay1sec = Sys.HCLK DIV 8; (* STM32F40x *) (* SYSTCSR bits: *) ENABLE = 0; TICKINT = 1; CLKSOURCE = 2; VAR x: INTEGER; BEGIN SYSTEM.PUT(ARMv7M.SYSTCSR, {}); (* disable SysTick *) flag := FALSE; (* NOTE: timer is 24-bit! *) (* http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0552a/Babieigh.html *) x := delay1sec DIV freq - 1; ASSERT(x > 0); ASSERT(x < 1000000H); SYSTEM.PUT(ARMv7M.SYSTRVR, x); SYSTEM.PUT(ARMv7M.SYSTCVR, 0); (* any write to current clears it *) SYSTEM.PUT(Sys.VectorsOrg + ARMv7M.SysTick * 4, SysTickIntHandler); SYSTEM.PUT(ARMv7M.SYSTCSR, {ENABLE,TICKINT}) (* enable timer with clock source of system clock / 2 with interrupts *) END Init; PROCEDURE OnTimer* (): BOOLEAN; VAR res: BOOLEAN; BEGIN res := flag; IF res THEN flag := FALSE END RETURN res END OnTimer; END IvanSysTick0. |
Автор: | Artyemov [ Вторник, 12 Январь, 2016 10:42 ] |
Заголовок сообщения: | Re: Компилятор Oberon → ARMv6-M, ARMv7E-M |
Иван Денисов писал(а): Artyemov писал(а): Иван, вы не удивились почему не сработало? SYSTEM.PUT(SYSTEM.ADR(a1), v1); и т.д. Запихнуть 6 INTEGER-ов (адрес каждого должен быть кратен 4-ём - про целевую архитектуру не забываем) в массив SHORTCHAR-ов (который может располагаться (ужас!!!) даже по нечётному адресу) - в общем, строгой типизацией не пахнет (: Я не совсем понял Вас... Не вопрос, поясню. Итак, SYSTEM.PUT(SYSTEM.ADR(a0), v1) (и далее аналогичные выражения) по адресу нулевого элемента массива типа SHORTCHAR помещает величину типа INTEGER. Фокус в том, что массив типа SHORTCHAR может располагаться по любому (в том числе нечётному - худший случай) адресу, а 32-разрядная величина (INTEGER) по адресу кратному 4. В этом случае SYSTEM.PUT должна вызвать исключение. Не так ли? |
Автор: | Пётр Кушнир [ Вторник, 12 Январь, 2016 10:46 ] |
Заголовок сообщения: | Re: Компилятор Oberon → ARMv6-M, ARMv7E-M |
Что мешает размещению четырёх байт значения типа INTEGER в четыре байта начиная с SYSTEM.ADR(a0)? |
Автор: | Artyemov [ Вторник, 12 Январь, 2016 11:55 ] |
Заголовок сообщения: | Re: Компилятор Oberon → ARMv6-M, ARMv7E-M |
По отдельности - ничего. Как одно целое (слово), да по нечётному (в общем случае) адресу - архитектура процессора не даст. Здесь идёт речь о ARM (напомню). INTEGER - является одним целым? SYSTEM.PUT(SYSTEM.ADR(a0), v1): v1 здесь будет разделена на байты? |
Автор: | Пётр Кушнир [ Вторник, 12 Январь, 2016 12:33 ] |
Заголовок сообщения: | Re: Компилятор Oberon → ARMv6-M, ARMv7E-M |
Ну, в целом, надо сначала уточнить, а потом выдвигать гипотезы, обычно так поступают. |
Автор: | Artyemov [ Вторник, 12 Январь, 2016 12:43 ] |
Заголовок сообщения: | Re: Компилятор Oberon → ARMv6-M, ARMv7E-M |
Пётр Кушнир писал(а): Ну, в целом, надо сначала уточнить, а потом выдвигать гипотезы, обычно так поступают. Так гипотеза это как раз то, что должно быть уточнено |
Автор: | Иван Денисов [ Вторник, 12 Январь, 2016 13:03 ] |
Заголовок сообщения: | Re: Компилятор Oberon → ARMv6-M, ARMv7E-M |
Artyemov писал(а): Здесь идёт речь о ARM (напомню). Нет, это программа управляющая. Она не на ARM.
|
Автор: | Artyemov [ Вторник, 12 Январь, 2016 13:41 ] |
Заголовок сообщения: | Re: Компилятор Oberon → ARMv6-M, ARMv7E-M |
Иван Денисов писал(а): Artyemov писал(а): Здесь идёт речь о ARM (напомню). Нет, это программа управляющая. Она не на ARM.Теперь получилось: исходно я не понял - ветка то про Oberon ARMv7E-M |
Автор: | Alexander Shiryaev [ Пятница, 04 Март, 2016 00:38 ] |
Заголовок сообщения: | Re: Компилятор Oberon → ARMv6-M, ARMv7E-M |
Добавил реализацию базовых системных модулей для поддержки микроконтроллеров STM32F103x{8,B} (Cortex-M3), являющихся основой для дешёвых плат LeafLabs Maple Mini |
Автор: | Alexander Shiryaev [ Пятница, 11 Март, 2016 02:06 ] |
Заголовок сообщения: | Re: Компилятор Oberon → ARMv6-M, ARMv7E-M |
Целочисленная реализация ФНЧ: Код: MODULE ObxLPFInt;
(* Alexander Shiryaev, 2016.01 Simple integer implementation of low-pass filter https://en.wikipedia.org/wiki/Low-pass_filter *) TYPE LPF* = RECORD (* low-pass filter *) rc*, n*: INTEGER END; PROCEDURE Init* (VAR f: LPF; x, n: INTEGER); BEGIN f.rc := LSL(x, n); f.n := n END Init; PROCEDURE Set* (VAR f: LPF; x: INTEGER); BEGIN f.rc := LSL(x, f.n) END Set; PROCEDURE Put* (VAR f: LPF; x: INTEGER); BEGIN f.rc := f.rc + x - ASR(f.rc, f.n) END Put; PROCEDURE Get* (f: LPF): INTEGER; BEGIN RETURN ASR(f.rc, f.n) END Get; END ObxLPFInt. |
Автор: | Иван Денисов [ Пятница, 29 Апрель, 2016 12:26 ] |
Заголовок сообщения: | Re: Компилятор Oberon → ARMv6-M, ARMv7E-M |
Компилятора Александра Ширяева использую уже в одной лабораторной установке для контроля четырех потоков (давлений, которые создают потоки). Вложение: res2.png [ 1.07 МБ | Просмотров: 7129 ] В установке использован микроконтроллер STM32F103C8T6, который управляет по I2C четырьмя 12-битными ЦАП микросхемами MCP4725. Микроконтроллер принимает команды из Блэкбокса, отправляет команды ЦАПам, которые формируют управляющее напряжение для контроллеров давления ITV. Ну а контроллеры в свою очередь формируют заданное давление на выходе (на входе подается 1.5 атмосферы). Для проверки системы погрузили капилляры в четыре банки с водой, чтобы по пузырькам поглядеть стабильность. Вот тут видео разместил: https://twitter.com/dia_magnetic/status ... 7347179520 |
Автор: | prospero78 [ Пятница, 29 Апрель, 2016 13:55 ] |
Заголовок сообщения: | Re: Компилятор Oberon → ARMv6-M, ARMv7E-M |
))) Да ты прям дизайнер. Всё у тебя ровно, стаканы в ряд, чистые, и кнопки на форме по линии)) Мой комбат бы оценил. |
Автор: | Info21 [ Суббота, 30 Апрель, 2016 18:01 ] |
Заголовок сообщения: | Re: Компилятор Oberon → ARMv6-M, ARMv7E-M |
Симпатично |
Автор: | Kubanych [ Понедельник, 02 Май, 2016 11:46 ] |
Заголовок сообщения: | Re: Компилятор Oberon → ARMv6-M, ARMv7E-M |
А ардуиновый Оберон сделать насколько сложно? |
Автор: | Ярослав Романченко [ Понедельник, 02 Май, 2016 16:19 ] |
Заголовок сообщения: | Re: Компилятор Oberon → ARMv6-M, ARMv7E-M |
Kubanych писал(а): А ардуиновый Оберон сделать насколько сложно? Так AVR компилятор давно лежит здесь http://svn.assembla.com/svn/oberonru/trunk/AVRCompilerТолько не ясно насколько он работоспособен. Я приведённые там примеры компилировал, заливал в Arduino... 2 дня проковырялся но ничего так и не заработало. По-мому, там компилятор генерирует какую-то хрень. Во всяком случае, дизассемблер показывал странную последовательность инструкций. PS. Компилятор запускается под A2 |
Автор: | Ярослав Романченко [ Понедельник, 02 Май, 2016 16:39 ] |
Заголовок сообщения: | Re: Компилятор Oberon → ARMv6-M, ARMv7E-M |
Тут велось обсуждение AVR компилятора http://a2os.org.ua/forums/forums.php?forum=17 |
Автор: | Kemet [ Понедельник, 02 Май, 2016 18:40 ] |
Заголовок сообщения: | Re: Компилятор Oberon → ARMv6-M, ARMv7E-M |
Ярослав Романченко писал(а): Только не ясно насколько он работоспособен. Я приведённые там примеры компилировал, заливал в Arduino... 2 дня проковырялся но ничего так и не заработало. Так компилятор поди под AVR32, а ардуины на 8-ми битном
|
Автор: | Ярослав Романченко [ Понедельник, 02 Май, 2016 19:22 ] |
Заголовок сообщения: | Re: Компилятор Oberon → ARMv6-M, ARMv7E-M |
Kemet писал(а): Так компилятор поди под AVR32, а ардуины на 8-ми битном А там ни одного вразумительного комментария, ни документации... Можно только догадываться, какой там компилятор.
|
Автор: | Kubanych [ Вторник, 03 Май, 2016 16:26 ] |
Заголовок сообщения: | Re: Компилятор Oberon → ARMv6-M, ARMv7E-M |
8 битный ардуиновый Оберон сделать насколько сложно? |
Автор: | Иван Денисов [ Среда, 04 Май, 2016 06:48 ] |
Заголовок сообщения: | Re: Компилятор Oberon → ARMv6-M, ARMv7E-M |
Kubanych писал(а): 8 битный ардуиновый Оберон сделать насколько сложно? Вот та плата на которой я сделал лабораторную установку она как раз совместима с Ардуино. Так что "ардуиновый Оберон" уже есть, если я правильно понимаю о чем вы говорите. Для 8-битных контроллеров нет особого смысла делать Оберон, так как типы данных плохо ложатся на 8 бит. Вирт специально под 32-битные спецификацию сузил, нету больше SHORTINT. А 32-битные микроконтроллеры уже по 100 рублей есть (хотя есть задачи промышленные, где это дорого...). Так что выкиньте ваш 8-ми битный контроллер и купите новую ARM-v6/v7 плату за 300 рублей. |
Страница 6 из 9 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |