Перейти к содержанию
    

Пробую запустить проект-пример 1-EventFlag на STM32VL-Discovery в средах Eclipse и Atollic.

Проект собрал вне среды запуском утилиты make, натравив на компилятор - gnuarm/4_6_2012q2. Все под Win7x64.

В районе перехода на os_start() ядро уходит в Hard Fault.

Atollic выдает чуть больше инфы: говорит о попытке обращения по адресу 0x20002004 (ОЗУ до 0x20001FFF).

В чем может быть дело?

 

Начал осваивать Eclipse и еще не разобрался, как сделать отображение листинга ассемблера (не компилятора) в окне Disassembly.

Потому пока точно не знаю, на какой строке вылетает.

 

PS. В makefile помимо пути до компилятора поправил CHIP = STM32F10X_MD_VL (на дискавери value-line).

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

PS. В makefile помимо пути до компилятора поправил CHIP = STM32F10X_MD_VL (на дискавери value-line).
Надо также поправить размеры памяти в скрипте линкера (*.ld)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Надо также поправить размеры памяти в скрипте линкера (*.ld)

Вроде все необходимое сделал автор примеров. Линкеру подсовывается $(CHIP).ld

Было:

MEMORY
{
    RAM (xrw)    : ORIGIN = 0x20000000, LENGTH =  20K
...

Стало:

MEMORY
{
    RAM (xrw)    : ORIGIN = 0x20000000, LENGTH =  8K
...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хм. По идее всё должно работать после правки параметра CHIP в makefile.

Попробуйте пример 4-Debug, он изначально рассчитан на discovery.

Если не заработает, попробуйте другой компилятор. На нём всё проверялось.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хм. По идее всё должно работать после правки параметра CHIP в makefile.

Попробуйте пример 4-Debug, он изначально рассчитан на discovery.

Если не заработает, попробуйте другой компилятор. На нём всё проверялось.

Попробовал пример 4-Debug - не заработал. Попробовал рекомендованный компилятор - работают оба проекта! Спасибо за подсказку!

Глянул в листинг. В компиляторе 4.6... переход на os_start выглядит так

 80002c0:    f7ff ffa6     bl    8000210 <os_start>
80002c4:    200003c4     .word    0x200003c4

В рекомендованном 4.8... -

 80002c6:    f7ff ffa3     bl    8000210 <os_start>
80002ca:    bf00          nop

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не вижу ничего криминального в этом фрагменте листинга. Скорее всего косяк где-то дальше.

Но раз проблема решена, то и фиг с ним:)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не знаю, по адресу обращаюсь или нет...

Не удается скомпилировать 1-EventFlag с помощью GCC 4.8.

 

выдает вот это:

 

z:\GCC_ARM\1-EventFlag>make

--- building 1-EventFlag

Ошибка в синтаксисе команды.

Ошибка в синтаксисе команды.

Ошибка в синтаксисе команды.

Ошибка в синтаксисе команды.

--- compiling ./src/main.cpp...

./src/main.cpp:128:1: fatal error: opening dependency file obj/main.d: No such f

ile or directory

compilation terminated.

make: *** [obj/main.o] Ошибка 1

 

В чем м.б. дело?

 

До этого ставил Sourcery G++ Lite 2010.09-51 - то же самое.

 

на форуме вычитал, что "может отсутствовать sh.exe"

что это такое и где взять? почему этого нет в комплекте с make или того же G++ Lite?

 

установил CoreUtils, ошибка пропала.

но возникла другая проблема:

 

z:\GCC_ARM\1-EventFlag>make

--- building 1-EventFlag

--- compiling ./src/main.cpp...

make: Interrupt/Exception caught (code = 0xc00000fd, addr = 0x4217b3)

 

 

вроде тоже пропала проблема: перенес все, что касается GNU (GCC, CoreUtils) в папку без скобок в названии (было в Program Files (x86))

теперь пытаюсь прикрутить к eclipse...

 

Изменено пользователем Argon-11

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для начинающих может быть полезно:

scmrtos-installation-on-arduino

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хочу поинтересоваться таким нюансом.

Приходится поддерживать много разных проектов под AVR для разных потребителей и высылать им обновления, чтоб они могли собирать свои проекты самостоятельно. Собрал подпрограммы в IAR библиотеку, чтоб было легче сопровождать. Но тут столкнулся с трудностью: не получается вкомпилировать объекты scmRTOS в библиотеку. Например мютексы. RTOS "не собирается" без настроек под конкретный проект. Может кто сталкивался, подскажите решение.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хочу поинтересоваться таким нюансом.

Приходится поддерживать много разных проектов под AVR для разных потребителей и высылать им обновления, чтоб они могли собирать свои проекты самостоятельно. Собрал подпрограммы в IAR библиотеку, чтоб было легче сопровождать. Но тут столкнулся с трудностью: не получается вкомпилировать объекты scmRTOS в библиотеку. Например мютексы. RTOS "не собирается" без настроек под конкретный проект. Может кто сталкивался, подскажите решение.

 

Там, насколько помню, используются шаблоны.

Это может ограничить возможность сборки универсальной библиотеки.

Или вообще такую возможность.

 

namespace OS
{
    template<> void TIdleProc::exec()
    {
        for(;;)
        {
        #if scmRTOS_IDLE_HOOK_ENABLE == 1
            idle_process_user_hook();
        #endif

        #if scmRTOS_TARGET_IDLE_HOOK_ENABLE == 1
            idle_process_target_hook();
        #endif
        }
    }
}

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Использовал ли кто-нибудь scmRTOS с IAR EWARM со включенной опцией "Enable thread support in library"?

Возникли проблемы с динамическим выделением памяти в нескольких процессах одновременно - malloc по умолчанию не реентерабельный и программа падает очень быстро. Вариантов решения два:

  1. Подменить malloc и free на свои через --redirect malloc и --redirect free
  2. Использовать штатные IARовские библиотечные функции в многопоточном варианте, для этого надо реализовать System locks interface, а конкретно функции

    void __iar_system_Mtxinit(__iar_Rmtx *); /* Initialize a system lock */

    void __iar_system_Mtxdst(__iar_Rmtx *);/*Destroy a system lock */

    void __iar_system_Mtxlock(__iar_Rmtx *); /* Lock a system lock */

    void __iar_system_Mtxunlock(__iar_Rmtx *); /* Unlock a system lock */

    и еще четыре аналогичных __iar_file_*

 

Второй вариант выглядит предпочтительным, т.к. если ограничиться заменой malloc конфликт может вылезти в какой-нибудь другой не реентерабельной функции системной библиотеки. Но есть сомнения в возможности увязать System locks interface с ОС на C++:

допустим, выполняется оператор new, он вызывает malloc, тот вызывает __iar_system_Mtxlock, тот должен использовать Tmutex, но чтобы существовал объект класса Tmutex, нужно чтобы он был создан с помощью new (явно или не явно). Проблема курицы и яйца какая-то.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

должен использовать Tmutex, но чтобы существовал объект класса Tmutex, нужно чтобы он был создан с помощью new (явно или не явно). Проблема курицы и яйца какая-то.

Можно создать объект класса TMutex статически.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По варианту 1 все получилось. Одного статически созданного мьютекса хватило, чтобы потоки не дрались за подмененный malloc. Других конфликтов из-за многопоточности внутри стандартной библиотеки пока не обнаружилось.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хочется реализовать работу с устройствами, подключенными у микроконтроллеру через последовательный интерфейс примерно следующим образом:

  • Есть процесс (A), отвечающий за организацию обмена и реализацию протокола
  • Есть несколько процессов (B), работающих каждый со своим подключенным устройством
  • Когда одному из процессов B необходимо записать данные в устройство, он вызывает функцию write и усыпляется до получения от устройства подтверждения записи данных или до истечения таймаута, затем проиходит пробуждение процесса и возврат ему результата операции из функции write 
  • Когда одному из процессов B необходимо прочитать данные из устройства, он вызывает функцию read и усыпляется до получения от устройства данных или до истечения таймаута, затем проиходит пробуждение процесса и возврат ему результата операции из функции read
  • Процесс A в свободное от выполнения заявок процессов B время подтягивает из устройств неприоритетные данные, т.е. не находится просто в спячке в ожидании OS::message

Что-то сразу не соображу, какие средства ScmRTOS для этого лучше подходят. Не вижу ничего с логикой работы "инициировать операцию и уснуть до ее завершения".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вариантов масса. От простейшего - метнули данные и встали на ожидание через OS::TEventFlag::wait(timeout) - проснулись, когда флаг просигналит процесс А (насколько я понял логику работы), и до организации очередей на OS::channel. OS::message - как вариант, аналогичный флагу событий с той разницей, что помимо собственно события можно ещё доставлять попутно какую-то полезную информацию, если это требуется. В общем, не увидел затруднений.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...