Миландр

Ключевым подразделением нашей компании
является Центр Проектирования интегральных микросхем
Текущее время: 2019-май-25 21:07

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 21 ]  На страницу 1, 2 Все  След.
Автор Сообщение
 Заголовок сообщения: ОСРВ МАКС
СообщениеДобавлено: 2019-апр-23 19:24 
Не в сети

Зарегистрирован: 2019-апр-23 17:27
Сообщения: 17
Доброго времени суток, коллеги!

Пробую запустить операционную систему на микроконтроллере 1967ВН034.
Делаю всё, как написано в pdf-документе "Руководство пользователя
ОСРВ МАКС-Lynx", который поставлялся на диске в комплекте с отладочной платой.

1. В документе сказанно: "ОСРВ МАКС-Lynx поддерживается только для LLVM Toolchain из состава среды CM-LYNX. При создании проекта необходимо выбрать “Milandr DSP1967 LLVM Cross C/C++". Именно так я и сделал.

2. Далее подключил бинарники самой ОСИ(macs.dlb и rtl.dlb) к проекту и добавил пути к хедерам (${eclipse_home}toolchain\Inc\macs).

3. Далее в документе сказано, что "Стандартный скрипт создаваемый средой не подходит!" Действительно с стандартным линкер-скриптом проект в принципе не собирался. В конце документа был предложен альтернатинвый скрипт линкера. Именно его я и использую в проекте.

В "новом" линкер скрипте видно, что сама программа (секция .program) будет располагаться в первом банке внутренней ОЗУ микропроцессора(а вернее в ПОЛОвине от первого банка памяти), а имеено:
Код:
M0Code { TYPE(RAM) START(0x00000000) END(0x00007FFF) WIDTH(32) }


После попытки компиляции выползает следующее сообщение в консоль сборки:
"
C:\Milandr\CM-LYNX\workspace\research_interfaces\research_interfaces_macs.ldf preprocessed Ok
Error[L307]: Not enough space to map section '.program' from './thirdparty/1967VN034/hal/src/hal_rtc.doj'
Error[L307]: Not enough space to map section '.program' from './thirdparty/1967VN034/hal/src/hal_spi.doj'
Error[L307]: Not enough space to map section '.program' from './thirdparty/1967VN034/hal/src/hal_uart.doj'
Error[L307]: Not enough space to map section '.program' from './thirdparty/1967VN034/hal/src/hal_updown.doj'
Link complete: 4 error(s), 0 warning(s)
make: *** [makefile:31: target-build] Error 2
"
Выходит, что линкер-скрипт прожевался средой хорошо, но ему там не хватает места, чтобы разместить в исполняемом файле все функции?
(Да и вообще почему среда пытается засунуть Все объектные файлы в один итоговый бинарник? Я не использую пока что функции из файлов hal_rtc, hal_spi, hal_uart, hal_updown, но ошибка выше говорит о том, что на них почему-то нет места в памяти. Хм.)

В общем с предлагаемым в официальной поставле линкер-скриптом для операционной системы МАКС проект не собирается.

Далее я руками поправил линкер-скрипт увеличив место для секции .program ровно в два раз. (потому что в соответствии с даташитом на проц банк памяти в два раза больше, в отличии от того, что прописано в поставляемом скрипте)

БЫЛО:
Код:
...
M0Code { TYPE(RAM) START(0x00000000) END(0x00007FFF) WIDTH(32) }
M1Code { TYPE(RAM) START(0x00008000) END(0x0000FFFF) WIDTH(32) }
M2Code { TYPE(RAM) START(0x00100000) END(0x0010DFFF) WIDTH(32) }
...


СТАЛО:
Код:
...
M0Code { TYPE(RAM) START(0x00000000) END(0x0000FFFF) WIDTH(32) }
M1Code { TYPE(RAM) START(0x00100000) END(0x0010DFFF) WIDTH(32) }
...

(M2Code теперь стал M1Code в силу того, что не использовалась нигде, а M0Code расширился на весь размер банка памяти).

После таких изменений проект стал собираться. Это радует.
Но после этого он при сборке начал выдаваться следующий ворнинг:
"
C:\Milandr\CM-LYNX\workspace\research_interfaces\research_interfaces_macs.ldf preprocessed Ok
Mapping sections for processor P0 ... Ok
Warning[L324]: Input section macsl.dlb [smp_os.o](extmem) has init qualifier incompatible with output section extmemseg
"
Не очень понимаю, что это означает и Почему.
После этого отладка запускается, но выполнение программы не доходит даже до "моего" мейна.
Судя по отладчику и map-файлу, процессор зависает где-то в области памяти, куда "засовывается" операционная система МАКС. И именно в её коде происходит зависание.

Подскажите пожалуйста куда копать дальше и где я делаю что-то неправильно?

С уважением,
Анисимов А.С.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ОСРВ МАКС
СообщениеДобавлено: 2019-апр-24 17:11 
Не в сети

Зарегистрирован: 2014-авг-15 11:04
Сообщения: 89
Откуда: Миландр
остается только вместо _main подставить в настройках _____system_start и дебагить
ОС начиная с 0-го адреса :D
Я попробовал на своей плате ВН44 пример macs_demo_044. К моему удивлению пример работает.
Для интереса походил по ОС начиная с 0-го адреса. Ничего особенного: всякие инициализации и пр.
Не встретил даже настроек внешнего интерфейса (хотя как настраивать если непонятно что снаружи :) )


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ОСРВ МАКС
СообщениеДобавлено: 2019-апр-24 22:13 
Не в сети

Зарегистрирован: 2019-апр-23 17:27
Сообщения: 17
BY_man писал(а):
Я попробовал на своей плате ВН44 пример macs_demo_044.


А где можно взять этот пример "macs_demo_044" ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ОСРВ МАКС
СообщениеДобавлено: 2019-апр-25 08:02 
Не в сети

Зарегистрирован: 2014-авг-15 11:04
Сообщения: 89
Откуда: Миландр
Я сначала сделал примитивный пример из дока, а потом обнаружил , что в
C:\Milandr\CM-LYNX\ есть такая директория macs_demo_workspace.
В ней у меня лежат два примера - один для 28-го, а второй для 44-го.
Пришлось только в led.h файле добавить #define MDR_VN034


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ОСРВ МАКС
СообщениеДобавлено: 2019-апр-25 14:14 
Не в сети

Зарегистрирован: 2019-апр-23 17:27
Сообщения: 17
BY_man писал(а):
Я сначала сделал примитивный пример из дока, а потом обнаружил , что в
C:\Milandr\CM-LYNX\ есть такая директория macs_demo_workspace.

Очень всё странно :(
У меня нет такой директории от слова совсем.
И ни одного примера. А документацию я обнаружил только на API операционной системы.
Где мне всё это можно взять?
Ну или не могли бы Вы показать какой линкер-скрпит используется в тех примерах. Или как-то скинуть пример.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ОСРВ МАКС
СообщениеДобавлено: 2019-апр-26 18:15 
Не в сети

Зарегистрирован: 2017-фев-14 11:21
Сообщения: 110
Здравствуйте!

Напишите, пожалуйста, на support@milandr.ru.

_________________
Отдел технической поддержки support@milandr.ru


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ОСРВ МАКС
СообщениеДобавлено: 2019-май-01 16:22 
Не в сети

Зарегистрирован: 2019-апр-23 17:27
Сообщения: 17
Проблема решилась простым обновление CM-LYNX до версии 1.06.03.01.
Значит версия 1.06.00 - нерабочая! То есть там можно только светодиодик зажечь. А рил-тайм? а дсп как?
Спасибо за помощь, буду пользоваться старшей версией.


Последний раз редактировалось Анисимов Александр 2019-май-02 00:16, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ОСРВ МАКС
СообщениеДобавлено: 2019-май-01 17:54 
Не в сети

Зарегистрирован: 2019-апр-23 17:27
Сообщения: 17
Зато теперь проблема в самом API операционной системы. Оно неполное. Работать нормально не представляется возможным!

Исходя из API:
В версии 1.06.03.01 есть потоки, мютексы и семафоры.
А в 1.06.00.00 есть (были бы, если бы оно работало) потоки, мютексы, семафоры, очереди, задержки(засыпание треда), трассировка, условные переменные(pthread_cond_init).
То есть "старая" версия по функциональности гораздо круче, но не работает. Надо было много времени потратить, чтобы это понять. Зачем она впринципе распространялась?...ну ладно...

Хорошо. Все эти очедеи, условные переменные, трассировки...можно руками написать.
Но как сделать нормально "засыпание" треда? Как задержку сделать?
Кроме бессмысленной траты ресурсов:
Код:
static void delay(long delay_ms)
{
   long cnt = DELAY_MS_FACTOR * delay_ms;
   while (--cnt) ;
}

Функцию взял из примеров.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ОСРВ МАКС
СообщениеДобавлено: 2019-май-06 11:47 
Не в сети
Аватара пользователя

Зарегистрирован: 2019-янв-15 10:14
Сообщения: 24
Откуда: г. Орел
Анисимов Александр писал(а):
Зато теперь проблема в самом API операционной системы. Оно неполное. Работать нормально не представляется возможным!

Исходя из API:
В версии 1.06.03.01 есть потоки, мютексы и семафоры.
А в 1.06.00.00 есть (были бы, если бы оно работало) потоки, мютексы, семафоры, очереди, задержки(засыпание треда), трассировка, условные переменные(pthread_cond_init).
То есть "старая" версия по функциональности гораздо круче, но не работает. Надо было много времени потратить, чтобы это понять. Зачем она впринципе распространялась?...ну ладно...

Хорошо. Все эти очедеи, условные переменные, трассировки...можно руками написать.
Но как сделать нормально "засыпание" треда? Как задержку сделать?
Кроме бессмысленной траты ресурсов:
Код:
static void delay(long delay_ms)
{
   long cnt = DELAY_MS_FACTOR * delay_ms;
   while (--cnt) ;
}

Функцию взял из примеров.


Засыпание только средствами ОС. Если ОС не поддерживает то не судьба... Если онная на основе freertos, по идее должен быть список задач которые заснули на определенные такты, и каждый такт ядро ОС'и должно проверять не пора ли будить задачу. То есть нужно создать список заснувших задач, подкорректировать планировщик чтобы их будил когда надо и функцию которая трубит отбой задаче.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ОСРВ МАКС
СообщениеДобавлено: 2019-май-06 20:10 
Не в сети

Зарегистрирован: 2019-апр-23 17:27
Сообщения: 17
Да, засыпание должно быть сделано на уровне ос, конечно.
Но его нет=(
Тут АПИ соответствует posix, но многого нет.

Ещё какая - то странная проблема проявилась сегодня.
Создал 3 разных треда.
Но работает только тот, который физически(в коде) был создан первым.
Почему такое может происходить?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ОСРВ МАКС
СообщениеДобавлено: 2019-май-07 10:46 
Не в сети
Аватара пользователя

Зарегистрирован: 2019-янв-15 10:14
Сообщения: 24
Откуда: г. Орел
Анисимов Александр писал(а):
Да, засыпание должно быть сделано на уровне ос, конечно.
Но его нет=(
Тут АПИ соответствует posix, но многого нет.

Ещё какая - то странная проблема проявилась сегодня.
Создал 3 разных треда.
Но работает только тот, который физически(в коде) был создан первым.
Почему такое может происходить?


Посмотрите приоритеты возможно первая имеет высокий приоритет и не дает ресурсов остальным.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ОСРВ МАКС
СообщениеДобавлено: 2019-май-14 15:23 
Не в сети

Зарегистрирован: 2019-апр-23 17:27
Сообщения: 17
Shrek писал(а):
Посмотрите приоритеты возможно первая имеет высокий приоритет и не дает ресурсов остальным.


Думаю, что нет.
Это похоже просто ошибка в реализации.

При создании потоков в линуксе они все имеют одинаковые дефолтный приоритет.
pthread_create() принимает аргумент, являющийся указателем на объект атрибутов потока. Если этот указатель равен NULL, поток конфигурируется на основании стандартных атрибутов. Но тут почему -то это не так, хотя АПИ полностью совпадает. (за исключением того, что оно неполное, как я уже выше писал)
Я менял очередность создания своих потоков и работал всегда только тот что был создан первым.

Либо внутри реализации стоит ограничение на количество параллельных потоков в системе.

В апи есть ещё функции по установке приоритета потоков по их айдишнику.
Попробую в эту сторону копнуть.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ОСРВ МАКС
СообщениеДобавлено: 2019-май-14 15:26 
Не в сети

Зарегистрирован: 2019-апр-23 17:27
Сообщения: 17
Shrek писал(а):
не дает ресурсов остальным.

Да :(

Потому что тут видимо ЗАБЫЛИ сделать засыпание треда!!!
Поэтому я написал себе задердку на основе прерываний от RTC.
И соответственно поток не "ждет" в понимании ОС, а "ждет" в тупом цикле, когда там нужное кол-во прерываний натикает.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ОСРВ МАКС
СообщениеДобавлено: 2019-май-14 15:49 
Не в сети

Зарегистрирован: 2014-июн-25 09:29
Сообщения: 115
Заинтересовался темой и заглянул в ихнее руководство программиста (https://www.astrosoft.ru/upload/rtos-ma ... mmista.pdf).

Цитата:
3.2.2.6. Метод Delay
Данный статический метод выполняет задержку выполнения задачи с блокировкой ее
планирования на время timeout_m
s.
Аргумент timeout_ms определяет величину задержки в миллисекундах.
Прототип:
Код:
static Result Delay(uint32_t timeout_ms);


Пример из этого же описания:
Цитата:
Код:
void Task1::Execute()
{
puts("Task1 is running");
while (true)
{
puts("Task2 is running");
Task* task = new Task2();
Add(task, Task::PriorityNormal, 0x50);
Delay(700);
puts("Task2 delete");
task->Delete();
}
}




Может так получится?

В исходнике под Cortex M3 у них этот метод так реализован:

Код:
Result Task::Delay(uint32_t timeout_ms)
{
   return Sch().BlockCurrentTask(timeout_ms);
}


Похоже действительно к планировщику обращаются.


Последний раз редактировалось andelie 2019-май-14 15:56, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ОСРВ МАКС
СообщениеДобавлено: 2019-май-14 15:51 
Не в сети

Зарегистрирован: 2019-апр-23 17:27
Сообщения: 17
Есть апи-вызов
Код:
int pthread_attr_init (pthread_attr_t *attr);


Как посмотреть что такое pthread_attr_t?
какие поля у этой структуры? как мне задать поток с НЕдефолтными атрибутами?


Последний раз редактировалось Анисимов Александр 2019-май-14 16:17, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 21 ]  На страницу 1, 2 Все  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB