Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Keil uVison + RTL
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Bosicc
Вот решил разобраться как работает компилятор и вообще весь аппарат создания прошивки под ARM.
Просмотрев примеры от производителя я обзавелся парочкой вопросов:

1. Как работает функция printf()? Где есть описание что нужно подключить к проекту что б это зароботало.

2. Для чего нужен файл Retarget.c ?

3. Где можно почитать что такое #pragma import(__use_no_semihosting_swi); ?

4. Что происходит когда в настройках проекта я ставлю галочку использования RTX Kernel ? ( Я попробовал использовать в RTOSе функцию printf, а при линковке возникает ошибка bcsp.axf: Error: L6915E: Library reports error: __use_no_semihosting_swi was requested, but _sys_open was referenced )

5. Где можно почитать описание как работают стандартные фунуции и как их инициализировать.
Bosicc
Ок, тогда добавлю еще одну формулировку вопроса.
Есть ли какой нибуть графический интерфейс для удобного конфигурирования RTOS. Что то на подобе графического интерфейса в DSP.
Или все нал делать ручками?
mihask
Цитата(Bosicc @ Feb 13 2007, 16:23) *
Ок, тогда добавлю еще одну формулировку вопроса.
Есть ли какой нибуть графический интерфейс для удобного конфигурирования RTOS. Что то на подобе графического интерфейса в DSP.
Или все нал делать ручками?


Для файлов RTX_Config.c и Startup.s есть в uVision (Keil). Когда открываешь один из этих файлов
то появляется закладочка с настройками smile.gif
mihask
Цитата(Bosicc @ Feb 13 2007, 11:42) *
Вот решил разобраться как работает компилятор и вообще весь аппарат создания прошивки под ARM.
Просмотрев примеры от производителя я обзавелся парочкой вопросов:

1. Как работает функция printf()? Где есть описание что нужно подключить к проекту что б это зароботало.

2. Для чего нужен файл Retarget.c ?

3. Где можно почитать что такое #pragma import(__use_no_semihosting_swi); ?

4. Что происходит когда в настройках проекта я ставлю галочку использования RTX Kernel ? ( Я попробовал использовать в RTOSе функцию printf, а при линковке возникает ошибка bcsp.axf: Error: L6915E: Library reports error: __use_no_semihosting_swi was requested, but _sys_open was referenced )

5. Где можно почитать описание как работают стандартные фунуции и как их инициализировать.


1. Чтобы заработало нужно подключить #include <stdio.h> как и везде

2. Retarget.c - нужен для переназначения стандартных функций С (для того чтобы подставить свою
функцию взамен библиотечной). Я в Retarget.c я переопределяю функции ввода/вывода UARTa, как раз для printf (Файл прилагаю). Кстати в примерах программ поставляемых с Keil есть примеры и с
использованием printf в том числе и вместе с RTL(Если нужно укажу путь).
KostyanPro
Цитата(Bosicc @ Feb 13 2007, 07:42) *
Вот решил разобраться как работает компилятор и вообще весь аппарат создания прошивки под ARM.
Просмотрев примеры от производителя я обзавелся парочкой вопросов:

1. Как работает функция printf()? Где есть описание что нужно подключить к проекту что б это зароботало.


Вам необходимо
1 подключить stdio.h
2 описать ручками функцию putchar
Посмотри для примера проект
С:\Keil\ARM\RV30\Examples\Measure

З,Ы Шустрый Вы,mihask, опередили с ответом. smile.gif
Bosicc
Хорошо.... Рассмотрение данного примера значительно расширило мой кругозор но так и не дало желаемых знаний.
Пример работает хорошо, задания запускаются и вроде бы его работа понятна.
Только вот немогу понять, когда писал свою программку на моменте выполнения функции os_init_context() из файла RTX_Config.c, на моменте
/* Allocate the memory space for the stack. */
p_TCB->stack = _alloc_box (m_stk);
программа подвисает.
Как можно понять и где почитать, как это все работает. Читал хелп, но из него понять что предварительно надо сделать для того что б это все заработало...
И что самое парадоксальное, использование работающих файлов из одного проекта, не дает работоспособности в другом. А лепить свой проект из заготовок, работу которых я не понимаю, очень не хочеться. Может есть хорошее описание всего этого дела?
mihask
Цитата(Bosicc @ Feb 14 2007, 11:34) *
Хорошо.... Рассмотрение данного примера значительно расширило мой кругозор но так и не дало желаемых знаний.
Пример работает хорошо, задания запускаются и вроде бы его работа понятна.
Только вот немогу понять, когда писал свою программку на моменте выполнения функции os_init_context() из файла RTX_Config.c, на моменте
/* Allocate the memory space for the stack. */
p_TCB->stack = _alloc_box (m_stk);
программа подвисает.
Как можно понять и где почитать, как это все работает. Читал хелп, но из него понять что предварительно надо сделать для того что б это все заработало...
И что самое парадоксальное, использование работающих файлов из одного проекта, не дает работоспособности в другом. А лепить свой проект из заготовок, работу которых я не понимаю, очень не хочеться. Может есть хорошее описание всего этого дела?


Да действительно в хелпе не шибко подробно все описано. smile.gif Но если знать принципы работы операционных систем жесткого реального времени (ссылок на литературу об них этом форуме много ), то в общем то все более понятно становится. smile.gif Боле подробного описания на RTL-ARM Keil, я не нашел.

Чтобы все заработало нужно:
- В Target выбрать RTX Kernel
- Настроить Startup.s - здесь инициализация железяки
(Железяка описана в даташите на микросхему,настройка в хелпе, для филипса например есть еще книжка Тревора Мартина);
- Настроить RTX_Config - здесь инициализация RTOS(описание в хелпе) (нужно обратить внимание на выделение размера стека дело в том что printf требует большого стека до 1.5 K(если float пользуете));
- Настроить Retarget.c (если есть необходимость) (описание в хелпе);
- Создать задачу инициализации;
- В задаче инициализации проинициализировать систему и создать задачи;
- В конце задачи инициализации выполнить функцию удаления задачи инициализации;
mihask
Цитата(mihask @ Feb 15 2007, 09:53) *
- Настроить Retarget.c (если есть необходимость) (описание в хелпе);


Ну не "Настроить Retarget.c" - конечно smile.gif - а переписать некоторые библиотечные
функции в случае необходимости.
Bosicc
Дальнейшее освоение осей показало:

При создании тасков возникает проблемка:
void init (void) __task
{
os_tsk_prio_self (1);
t_init = os_tsk_self ();

t_clock = os_tsk_create (clock_task,5);

t_uart_trans = os_tsk_create(uart_transport, 4);

os_tsk_delete_self ();
}

После создания задание uart_transport функция os_tsk_create возвращает 0, а задание крутится. Но что самое интересное, что функция os_tsk_delete_self (); не выполняется. Что это может быть. Может где то я с распределением памяти залетаю?
Andrew2000
Цитата(Bosicc @ Feb 16 2007, 16:10) *
Но что самое интересное, что функция os_tsk_delete_self (); не выполняется.

Мне казалось, что в документации -
Keil\ARM\Hlp\RTL.chm --> RTX Kernel -> Function Reference -> Task Management -> os_tsk_create
- все расписано.
Почему Вы не читаете документацию? Все, о чем в этой ветке говорится - есть в доках.

"... If the new task has a higher priority, then a task switch to the new task will immediately take place."

void init (void) __task
{
os_tsk_prio_self (250);

и, кстати, os_tsk_delete_self (); совершенно не обязательна - можно в этой задаче и дальше работать и не запускать лишнюю.
Bosicc
Цитата(Andrew2000 @ Feb 16 2007, 22:45) *
Почему Вы не читаете документацию? Все, о чем в этой ветке говорится - есть в доках.

"... If the new task has a higher priority, then a task switch to the new task will immediately take place."

void init (void) __task
{
os_tsk_prio_self (250);

и, кстати, os_tsk_delete_self (); совершенно не обязательна - можно в этой задаче и дальше работать и не запускать лишнюю.


1. Я думал что когда я запускаю новое задание оно не имеет никакого отношения к текущему, тоесть мое задание 100% должно дойти до конца. Теперь понял свою ошибку. Спасибо.
Bosicc
Даже незнаю с чего и начать...
Как работают таски я разобрался, номного поигрался с ивентами. приоритетами, написал тестик свой, все было ок.
Потом решил что пора приступать к болие серьезной работе.
Начали писать свой код. 3 дня собирал исходники в кучу, правил синтаксис... одним словом делал что б компилятор не ругался. После того как компилятор успокоился, начал бунтовать линковщик. Его удовлетворил тоже, но в самый последний момент, он мне выдал такое:
Error: L6200E: Symbol __stdout multiply defined (by retarget.o and stdio.o).

Я заглянул в файлик retarget.с и закоментировал строку
//FILE __stdout;

Все слинковалось и заработал. Но как только в одном из своих тасков, я попробовал вызвать свою функцию, я получил новую ошибку:
Error: L6915E: Library reports error: __use_no_semihosting_swi was requested, but _sys_open was referenced

Уже перечитал все их мануалы и хелпы, но я так и не понял как эта штука включается и работает. Может кто нибуть рассказать на пальцах, или ткнуть в книгу умную. Буду очень благодарен, бо уже 3 дня как головой об стену. Все файли перелопатил, но даже незнаю в какую сторону смотреть...
Andrew2000
Keil\ARM\Hlp\rvi.chm -> "Embedded Programs" -> "Library Retarget File"

а лучше - первоисточник:
http://www.arm.com/pdfs/DUI0205G_rvct_comp...aries_guide.pdf
Bosicc
Покопавшись 3 дня в своих сырцах и посчитал мануал, я нашел в своем коде строчку, в которой использовалась по ошибке функция fclose() которая и была причиной всех бед.
Но теперь появилась новая проблема. Программа стартует, задачи стартуют все ок... Но если в одном из тасков вызвать мою функцию, то программа срывается и зависает на
label: goto label; /* endless loop */
Как я понял, это от переполнения стека. Но какого стека, как его расчитать. И как правильно это делать. Где можно почитать, что б не пробовать на практике постигнуть теорию?
VAI
Если это переполнение стека, то в rtx_conf_.c включить проверку на переполнение стека и поставить точку останова в функции os_stk_overflow() на пустом for(;;); и смотреть значение переменной task_id.
Bosicc
Готов биться головой об стенку!!!
Есть проблема. Есть 5 заданий. Все запускаю все работает. Но стоит мне провести один эксперимент, как все накрывается.
Описываю ситуацию. Есть 5 заданий. Из одного задания стартуют остальные 4 задания. Все работает отлично. Но если в одном изи заданий вызвать одну функцию как программа не доходя до функции main() зацикливается в файле Retarget.c. Если эту функцию не вызывать, то все работает. Болие того, даже если я не запускаю задание в котором вызываю свою функцию программа все равно валиться.
С размером стека заданий и размером стеков игрался, но ни имея хороших знаний, не могу понять в чем может быть подковырка.
VAI
может тогда код в студию?
Костян
Вопрос больше по переходу с карма:

Если в RVC аналог CARM "Go To Definition "name_function" . Либо только через поиск ?
А также что нить подобное на Source Browser Windows " ???
Bosicc
Цитата(VAI @ Mar 6 2007, 11:35) *
может тогда код в студию?


Я еще не достиг крайнего придела smile.gif
Но прочитав Ваш пост, я дико разозлился на себя и решил перекопать еще раз свой код. Разобрал его вплоть до самого начала. И нашел!!!
В одном из файлов я вызывал функцию malloc() при этом мой код вообще не стартовал, даже до мейна не доходил. После того как убирал вызов все работало. Я призадумался... и нашел что я Олень smile.gif Я забыл выделить место под кучу ( Heap_Size EQU 0x00000000 ). Как только выделил место, программа перестала падать. Но вот вопрос, почему небыло никакой ошибки, просто программа срывалась на sys_exit(). Может есть какие то методы это контролировать?
Щас от счастья пойду cheers.gif ( неделю убил читая доку )
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.