реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Keil uVison + RTL, подробности и детали.
Bosicc
сообщение Feb 13 2007, 08:42
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 93
Регистрация: 5-03-06
Из: Украина, Киев
Пользователь №: 14 970



Вот решил разобраться как работает компилятор и вообще весь аппарат создания прошивки под 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. Где можно почитать описание как работают стандартные фунуции и как их инициализировать.
Go to the top of the page
 
+Quote Post
Bosicc
сообщение Feb 13 2007, 13:23
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 93
Регистрация: 5-03-06
Из: Украина, Киев
Пользователь №: 14 970



Ок, тогда добавлю еще одну формулировку вопроса.
Есть ли какой нибуть графический интерфейс для удобного конфигурирования RTOS. Что то на подобе графического интерфейса в DSP.
Или все нал делать ручками?
Go to the top of the page
 
+Quote Post
mihask
сообщение Feb 13 2007, 16:43
Сообщение #3


Частый гость
**

Группа: Validating
Сообщений: 80
Регистрация: 7-12-05
Пользователь №: 11 905



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


Для файлов RTX_Config.c и Startup.s есть в uVision (Keil). Когда открываешь один из этих файлов
то появляется закладочка с настройками smile.gif
Go to the top of the page
 
+Quote Post
mihask
сообщение Feb 13 2007, 17:07
Сообщение #4


Частый гость
**

Группа: Validating
Сообщений: 80
Регистрация: 7-12-05
Пользователь №: 11 905



Цитата(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(Если нужно укажу путь).

Сообщение отредактировал mihask - Feb 13 2007, 17:13
Прикрепленные файлы
Прикрепленный файл  Retarget.c.txt ( 1.5 килобайт ) Кол-во скачиваний: 289
Прикрепленный файл  Serial.c.txt ( 4.47 килобайт ) Кол-во скачиваний: 723
 
Go to the top of the page
 
+Quote Post
KostyanPro
сообщение Feb 13 2007, 17:13
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 160
Регистрация: 30-01-07
Из: Minsk
Пользователь №: 24 870



Цитата(Bosicc @ Feb 13 2007, 07:42) *
Вот решил разобраться как работает компилятор и вообще весь аппарат создания прошивки под ARM.
Просмотрев примеры от производителя я обзавелся парочкой вопросов:

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


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

З,Ы Шустрый Вы,mihask, опередили с ответом. smile.gif

Сообщение отредактировал KostyanPro - Feb 13 2007, 17:15
Go to the top of the page
 
+Quote Post
Bosicc
сообщение Feb 14 2007, 08:34
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 93
Регистрация: 5-03-06
Из: Украина, Киев
Пользователь №: 14 970



Хорошо.... Рассмотрение данного примера значительно расширило мой кругозор но так и не дало желаемых знаний.
Пример работает хорошо, задания запускаются и вроде бы его работа понятна.
Только вот немогу понять, когда писал свою программку на моменте выполнения функции os_init_context() из файла RTX_Config.c, на моменте
/* Allocate the memory space for the stack. */
p_TCB->stack = _alloc_box (m_stk);
программа подвисает.
Как можно понять и где почитать, как это все работает. Читал хелп, но из него понять что предварительно надо сделать для того что б это все заработало...
И что самое парадоксальное, использование работающих файлов из одного проекта, не дает работоспособности в другом. А лепить свой проект из заготовок, работу которых я не понимаю, очень не хочеться. Может есть хорошее описание всего этого дела?
Go to the top of the page
 
+Quote Post
mihask
сообщение Feb 15 2007, 06:53
Сообщение #7


Частый гость
**

Группа: Validating
Сообщений: 80
Регистрация: 7-12-05
Пользователь №: 11 905



Цитата(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 (если есть необходимость) (описание в хелпе);
- Создать задачу инициализации;
- В задаче инициализации проинициализировать систему и создать задачи;
- В конце задачи инициализации выполнить функцию удаления задачи инициализации;
Go to the top of the page
 
+Quote Post
mihask
сообщение Feb 15 2007, 10:42
Сообщение #8


Частый гость
**

Группа: Validating
Сообщений: 80
Регистрация: 7-12-05
Пользователь №: 11 905



Цитата(mihask @ Feb 15 2007, 09:53) *
- Настроить Retarget.c (если есть необходимость) (описание в хелпе);


Ну не "Настроить Retarget.c" - конечно smile.gif - а переписать некоторые библиотечные
функции в случае необходимости.
Go to the top of the page
 
+Quote Post
Bosicc
сообщение Feb 16 2007, 16:10
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 93
Регистрация: 5-03-06
Из: Украина, Киев
Пользователь №: 14 970



Дальнейшее освоение осей показало:

При создании тасков возникает проблемка:
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 (); не выполняется. Что это может быть. Может где то я с распределением памяти залетаю?

Сообщение отредактировал Bosicc - Feb 16 2007, 16:11
Go to the top of the page
 
+Quote Post
Andrew2000
сообщение Feb 16 2007, 23:45
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 421
Регистрация: 25-12-04
Пользователь №: 1 675



Цитата(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 (); совершенно не обязательна - можно в этой задаче и дальше работать и не запускать лишнюю.
Go to the top of the page
 
+Quote Post
Bosicc
сообщение Feb 17 2007, 11:12
Сообщение #11


Частый гость
**

Группа: Свой
Сообщений: 93
Регистрация: 5-03-06
Из: Украина, Киев
Пользователь №: 14 970



Цитата(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% должно дойти до конца. Теперь понял свою ошибку. Спасибо.
Go to the top of the page
 
+Quote Post
Bosicc
сообщение Feb 28 2007, 11:32
Сообщение #12


Частый гость
**

Группа: Свой
Сообщений: 93
Регистрация: 5-03-06
Из: Украина, Киев
Пользователь №: 14 970



Даже незнаю с чего и начать...
Как работают таски я разобрался, номного поигрался с ивентами. приоритетами, написал тестик свой, все было ок.
Потом решил что пора приступать к болие серьезной работе.
Начали писать свой код. 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 дня как головой об стену. Все файли перелопатил, но даже незнаю в какую сторону смотреть...
Go to the top of the page
 
+Quote Post
Andrew2000
сообщение Feb 28 2007, 12:10
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 421
Регистрация: 25-12-04
Пользователь №: 1 675



Keil\ARM\Hlp\rvi.chm -> "Embedded Programs" -> "Library Retarget File"

а лучше - первоисточник:
http://www.arm.com/pdfs/DUI0205G_rvct_comp...aries_guide.pdf
Go to the top of the page
 
+Quote Post
Bosicc
сообщение Mar 2 2007, 13:55
Сообщение #14


Частый гость
**

Группа: Свой
Сообщений: 93
Регистрация: 5-03-06
Из: Украина, Киев
Пользователь №: 14 970



Покопавшись 3 дня в своих сырцах и посчитал мануал, я нашел в своем коде строчку, в которой использовалась по ошибке функция fclose() которая и была причиной всех бед.
Но теперь появилась новая проблема. Программа стартует, задачи стартуют все ок... Но если в одном из тасков вызвать мою функцию, то программа срывается и зависает на
label: goto label; /* endless loop */
Как я понял, это от переполнения стека. Но какого стека, как его расчитать. И как правильно это делать. Где можно почитать, что б не пробовать на практике постигнуть теорию?
Go to the top of the page
 
+Quote Post
VAI
сообщение Mar 3 2007, 10:57
Сообщение #15


Профессионал
*****

Группа: Модераторы
Сообщений: 1 120
Регистрация: 17-06-04
Пользователь №: 37



Если это переполнение стека, то в rtx_conf_.c включить проверку на переполнение стека и поставить точку останова в функции os_stk_overflow() на пустом for(;;); и смотреть значение переменной task_id.


--------------------
Если зайца бить, его можно и спички научить зажигать
Сколько дурака не бей - умнее не будет. Зато опытнее
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 17:02
Рейтинг@Mail.ru


Страница сгенерированна за 0.01495 секунд с 7
ELECTRONIX ©2004-2016