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

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> Универсальный порт для Cortex-Mx (GCC) залит в репозиторий.
AHTOXA
сообщение Apr 20 2015, 05:57
Сообщение #16


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Сделал, залил в репозиторий. rev. 587.

Для того, чтобы получить приоритет прерывания системного таймера чуть выше, чем приоритет прерывания планировщика, необходимо в scmRTOS_TARGET_CFG.h объявить макрос
Код
#define CORE_PRIORITY_BITS  2

Если этот макрос не объявлен, то считается, что приоритет имеет 8 значащих бит. Так как на всех знакомых мне камнях приоритет имеет менее 8 бит, то в этом случае всё будет работать как раньше, приоритет прерывания системного таймера будет самым низким.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Apr 23 2015, 06:23
Сообщение #17


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

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Цитата(AHTOXA @ Apr 20 2015, 08:57) *
Для того, чтобы получить приоритет прерывания системного таймера чуть выше, чем приоритет прерывания планировщика, необходимо в scmRTOS_TARGET_CFG.h объявить макрос
Код
#define CORE_PRIORITY_BITS  2

Если этот макрос не объявлен, то считается, что приоритет имеет 8 значащих бит. Так как на всех знакомых мне камнях приоритет имеет менее 8 бит, то в этом случае всё будет работать как раньше, приоритет прерывания системного таймера будет самым низким.


Ещё б документировать его не только на форуме...

И вообще, мне кажется, стоит добавить табличку с комментариями в target_cfg.h:
CORE_PRIORITY_BITS = 4 для STM32F1xx, F2xx, (F3xx ?), F4xx, LPC17xx, LPC18xx
CORE_PRIORITY_BITS = 3 для LPC13xx, LM3S
CORE_PRIORITY_BITS = 2 для STM32L0xx, LPC11xx

Значения для этой таблички может выдать grep __NVIC_PRIO_BITS по базе с заголовками на процессоры. У меня таковой нет, к сожалению...


И да, принудительно привести тип будет аккуратнее:
enum { SYS_TIMER_PRIORITY = (uint8_t)(0xFEUL << (8-(CORE_PRIORITY_BITS))) };


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Apr 23 2015, 10:00
Сообщение #18


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(esaulenka @ Apr 23 2015, 11:23) *
Ещё б документировать его не только на форуме...

Я ещё в список рассылки отписался.
Надо будет ещё добавить про новый порт новость на сайт. И обновить документацию... Но это уж к следующему релизу, наверное sm.gif

Цитата(esaulenka @ Apr 23 2015, 11:23) *
И вообще, мне кажется, стоит добавить табличку с комментариями в target_cfg.h:

Дело в том, что scmRTOS_TARGET_CFG.h - это файл уровня проекта, то есть, он изначально не рассчитан для применения на разных контроллерах.
Хотя, можно и добавить, не помешает.
Цитата(esaulenka @ Apr 23 2015, 11:23) *
И да, принудительно привести тип будет аккуратнее:
enum { SYS_TIMER_PRIORITY = (uint8_t)(0xFEUL << (8-(CORE_PRIORITY_BITS))) };

Да, верное замечание, спасибо. Только я лучше маску добавлю, потому что доступ к словам оптимальнее:
enum { SYS_TIMER_PRIORITY = ((0xFEUL << (8-(CORE_PRIORITY_BITS))) & 0xFF) };


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
arhiv6
сообщение Sep 29 2016, 18:55
Сообщение #19


Знающий
****

Группа: Свой
Сообщений: 633
Регистрация: 21-05-10
Из: Томск
Пользователь №: 57 423



Разбирался с переключением контекста, появился вопрос: можно ли в обработчике прерывания PendSV_Handler() вместо
Код
" LDR R1, =os_context_switch_hook \n" // call os_context_switch_hook();
" BLX R1                          \n"
использовать
Код
" BL =os_context_switch_hook \n" // call os_context_switch_hook();

вроде же команды равнозначны, но получается на одну инструкцию меньше. Или есть причины делать переход по адресу, а не по метке?


--------------------
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Sep 29 2016, 21:59
Сообщение #20


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



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


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Aaron
сообщение Oct 12 2016, 05:54
Сообщение #21


Местный
***

Группа: Свой
Сообщений: 243
Регистрация: 5-10-06
Из: Зеленоград
Пользователь №: 21 007



а что мешает в таком случае объявление функции os_context_switch_hook сделать в одной секции с PendSV_Handler?
Надо полагать, и остальные хуки можно попробовать сделать так же?
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 12 2016, 07:13
Сообщение #22


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



В общем, довольно долго у меня там был как раз ближний переход. Потом обнаружилось, что при разнице адресов больше допустимого для ближнего перехода GCC никак не ругается, а молча генерирует нерабочий код. Обсудили это с коллегами. Обсуждали вариант сделать макрос, чтобы пользователь мог сам переключать. Но потом посчитали, что на фоне всего обработчика (включая код os_context_switch_hook) дополнительные 2 такта настолько ничтожны, что проще, надёжнее и вернее сделать безусловно дальний переход.

Остальные хуки вызываются из сишного кода, поэтому там выбора нет.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
alex6441161
сообщение Dec 20 2016, 06:26
Сообщение #23





Группа: Участник
Сообщений: 9
Регистрация: 12-08-14
Пользователь №: 82 528



Цитата(AHTOXA @ Mar 31 2015, 23:03) *
Всем привет.

Добрался до Cortex-M0+ (STM32L0xx). Подумал, что отличий от порта для Cortex-M4(F) немного, и поэтому взял порт Cortex-M0 от Сергея Борща и влил его в M4(F).
А так как порт Cortex-M4(F) уже поддерживал Cortex-M3, то порт получился универсальный.
Назвал порт CortexMx, чтоб не трогать имеющиеся. Поддерживаются Cortex-M3, Cortex-M4(F), Cortex-M0, Cortex-M0+, Cortex-M1.
Добавил также пример для STM32L0xx (плата STM32 NUCLEO-L053R8).

Планирую после тестирования перевести на этот порт все примеры для M3/M4.

Замечания и предложения приветствуютсяsm.gif



Здравствуйте, извиняюсь что не по совсем по теме но...
не могу найти порт для Cortex-A8. Может у кого есть?
Go to the top of the page
 
+Quote Post
dxp
сообщение Dec 20 2016, 07:09
Сообщение #24


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



QUOTE (alex6441161 @ Dec 20 2016, 13:26) *
Здравствуйте, извиняюсь что не по совсем по теме но...
не могу найти порт для Cortex-A8. Может у кого есть?

Эк вы замахнулись! sm.gif Нет, такого порта, увы, нет. В перспективе может появиться под SoC c FPGA, но там A9. А у вас какой процессор конкретно?


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
darkling07
сообщение Apr 12 2017, 09:10
Сообщение #25





Группа: Новичок
Сообщений: 3
Регистрация: 12-07-05
Пользователь №: 6 720



Подскажите, на что обратить внимание при переходе с версии 4.00 на 5 (5.10 аналогично)? Есть проект на lpc1768 и gcc, который пережил еще scmRTOS 3. На версии 4.00 все замечательно работает. С версией 5 после изменения CortexM3 на СоrtexMx все скомпилилось, но не работет. Инициализация проходит точно, но после OS::run() процессы не идут.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Apr 12 2017, 11:03
Сообщение #26


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Проверьте имена обработчиков прерываний SysTick и PendSv. Там что-то менялось, вроде.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
darkling07
сообщение Apr 12 2017, 16:22
Сообщение #27





Группа: Новичок
Сообщений: 3
Регистрация: 12-07-05
Пользователь №: 6 720



Да, точно они. Спасибо!
Было PendSVC_ISR и SystemTimer_ISR , стало PendSV_Handler и SysTick_Handler
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Apr 12 2017, 19:58
Сообщение #28


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Это чтобы соответствовать нынешним именам в CMSIS. Для PendSV_Handler я оставил weak-алиас:
Код
#pragma weak PendSVC_ISR = PendSV_Handler

А вот с SysTick так не получилось, потому что там ещё нужна возможность использования другого таймера.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Apr 24 2017, 07:30
Сообщение #29


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

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Балуюсь свежим gcc с link time optimization.
В двух проектах он как-то хитро оптимизировал os_context_switch_hook() и __init_system_timer() - почему-то решил, что символ не определён.
Причём в одном выкинул одну функцию, в другом - другую.
Помогло приписывание этим функциям атрибута used.

Сейчас попробовал тестовый пример - там выкинуло обе :-)
Код
Invoking: Cross ARM GNU C++ Linker
arm-none-eabi-g++ -mcpu=cortex-m3 -mthumb -Os -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -ffreestanding
-flto -Wunused -Wuninitialized -Wall -Wextra -Wmissing-declarations -Wconversion -Wpointer-arith -Wpadded -Wshadow -Wlogical-op
-Waggregate-return -Wfloat-equal  -g -T mem.ld -T libs.ld -T sections.ld -nostartfiles -Xlinker --gc-sections -L"../ldscripts"
-Wl,-Map,"scmRTOS.map" --specs=nano.specs -o "scmRTOS.elf"  
./src/src/_cxx.o ./src/src/_exit.o ./src/src/_sbrk.o ./src/src/_syscalls.o ./src/src/assert.o  ./src/_write.o ./src/main.o ./src/os_kernel.o
./src/os_services.o ./src/os_target.o ./src/recursive_mutex.o ./src/startup.o ./src/sysinit.o ./src/usrlib.o  

C:\Users\ESAULE~1\AppData\Local\Temp\ccEIkvE6.ltrans0.ltrans.o: In function `PendSV_Handler':
<artificial>:(.text.PendSV_Handler+0x1c): undefined reference to `os_context_switch_hook'
C:\Users\ESAULE~1\AppData\Local\Temp\ccEIkvE6.ltrans0.ltrans.o: In function `Reset_Handler':
<artificial>:(.text.Reset_Handler+0x190): undefined reference to `__init_system_timer'


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Apr 24 2017, 09:53
Сообщение #30


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



С LTO у меня не получилось собрать ни разу с тех пор, как я перенёс ассемблерные функции в *.cpp.
Похоже, компилятор не понимает вызовов из инлайн-ассемблера.
Вот всё думаю, что раньше случится - авторы gcc допилят gcc, или я переделаю обратно на *.S файл sm.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th April 2024 - 21:22
Рейтинг@Mail.ru


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