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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> stm32l1xx и scmRtos4 (cortex-m3), нужна помощь.. не запускается OS::run()
Посторонним В...
сообщение Jan 12 2013, 20:01
Сообщение #1


Участник
*

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



Нужна помощь специалистов...

за основу взят пример из проекта stm32f1xx...

проект полностью переделал и адаптировал для данного процесора...
проект компилируется... но при запуске OS::run() процессор вываливается в прерывание HardFault...

без ОС мигание светодиодами идет нормально... системный таймер работает..

подскажите где искать проблему...
Go to the top of the page
 
+Quote Post
Посторонним В...
сообщение Jan 12 2013, 21:36
Сообщение #2


Участник
*

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



собственно говоря проблема решилась путем отключения инициализации системного таймера в файле OS_Target_asm.S

хотелось бы понять правильно е ли решение ??? или задумка авторов была немного другой???


//-----------------------------------------------------------------------------
// Initialize system timer.
// void init_system_timer()
// Perform systick timer initialization.
//
.weak __init_system_timer
__init_system_timer:

LDR R1, =NVIC_SYSPRI15 // Set the SysTick exception priority (lowest)
LDR R2, =NVIC_ST_PRI
STRB R2, [R1]

LDR R1, =NVIC_ST_RELOAD // Setup SysTick
LDR R2, =(SYSTICKFREQ/SYSTICKINTRATE-1)
STR R2, [R1]
LDR R1, =NVIC_ST_CTRL // Enable and run SysTick
LDR R2, =(NVIC_ST_CTRL_CLK_SRC | NVIC_ST_CTRL_INTEN | NVIC_ST_CTRL_ENABLE)
STR R2, [R1]
BX LR

//-----------------------------------------------------------------------------
// START MULTITASKING
// void os_start(stack_item_t* sp)
//
// Note(s) : 1) os_start() MUST:
// a) Setup PendSV and SysTick exception priority to lowest;
// cool.gif Setup SysTick (reload value);
// c) Enable interrupts (tasks will run with interrupts enabled).
// d) Jump to exec() function of the highest priority process.
//
.thumb_func
os_start:
LDR R1, =NVIC_SYSPRI14 // Set the PendSV exception priority (lowest)
LDR R2, =NVIC_PENDSV_PRI
STRB R2, [R1]

LDR R4, [R0, #(4 * 14)] // Load process entry point into R4
ADD R0, #(4 * 16) // emulate context restore
MSR PSP, R0 // store process SP to PSP
MOV R0, #2 // set up the current (thread) mode: use PSP as stack pointer, privileged level
MSR CONTROL, R0
ISB // Insert a barrier

// BL __init_system_timer // run system timer

CPSIE I // Enable interrupts at processor level

BX R4 // Jump to process exec() function

.end

Сообщение отредактировал Посторонним В... - Jan 12 2013, 21:37
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jan 13 2013, 00:39
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Посторонним В... @ Jan 12 2013, 23:36) *
собственно говоря проблема решилась путем отключения инициализации системного таймера в файле OS_Target_asm.S

Решилась проблема или только спряталась, не знаю.
Но Target_asm.S редактировать не нужно:
так как __init_system_timer - weak-функция, то достаточно объявить свою с таким же названием:
Код
extern "C" void __init_system_timer()
{ // своя инициализация таймера
}


Пример проекта смотрите по ссылке custom-timer-stm32f2
.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 13 2013, 00:44
Сообщение #4


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

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



А как у вас ось работает без системного таймера? Или у вас используется другой таймер, и вы написали свою инициализацию?
Если так, то задумка авторов была в том, что пользователь в этом случае не будет сразу править ось, а просто напишет свою функцию __init_system_timer() sm.gif
Пример использования пользовательского таймера есть вот здесь: (STM32F2XX/2-Message). Там же есть файл readme.txt, где написано, как всё делается.

ЗЫ. Опоздалsm.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Tiro
сообщение Jan 13 2013, 01:45
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 781
Регистрация: 3-10-04
Из: Санкт-Петербург
Пользователь №: 768



Цитата(AHTOXA @ Jan 13 2013, 03:44) *
ЗЫ. Опоздалsm.gif

bb-offtopic.gif Антоха, а у вас правда плохо с работой в Уфе? А то моя знакомая жалуется (правда у нее образования нет). Пиши лучше в личку.
Go to the top of the page
 
+Quote Post
Vasya777
сообщение Jan 13 2013, 07:00
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 22-01-12
Пользователь №: 69 790



Тоесть любой таймер можно сделать системным?
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 13 2013, 11:13
Сообщение #7


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

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



Да, можно.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Посторонним В...
сообщение Jan 13 2013, 14:48
Сообщение #8


Участник
*

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



Цитата(AHTOXA @ Jan 13 2013, 00:44) *
А как у вас ось работает без системного таймера? Или у вас используется другой таймер, и вы написали свою инициализацию?
Если так, то задумка авторов была в том, что пользователь в этом случае не будет сразу править ось, а просто напишет свою функцию __init_system_timer() sm.gif
Пример использования пользовательского таймера есть вот здесь: (STM32F2XX/2-Message). Там же есть файл readme.txt, где написано, как всё делается.

ЗЫ. Опоздалsm.gif


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

static inline void init_system_timer(void)
{
RCC_ClocksTypeDef RCC_Clocks;

// SysTick end of count event each 1ms
RCC_GetClocksFreq( &RCC_Clocks );

SysTick_Config( RCC_Clocks.HCLK_Frequency / 1000 );
}


Сообщение отредактировал Посторонним В... - Jan 13 2013, 15:18
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jan 13 2013, 15:13
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Посторонним В... @ Jan 13 2013, 16:48) *
я свою написал... на базе примера... с использованием стандартных либов и подключил при инициализации железа...
после инициализации клоков...

static inline void init_system_timer(void)
{
RCC_ClocksTypeDef RCC_Clocks;

// SysTick end of count event each 1ms
RCC_GetClocksFreq( &RCC_Clocks );

SysTick_Config( RCC_Clocks.HCLK_Frequency / 1000 );
}

почему то не захотел таймер инициализировать...


Так должно быть по идее:
Код
extern "C" void __init_system_timer()
{

}

Go to the top of the page
 
+Quote Post
Посторонним В...
сообщение Jan 13 2013, 15:22
Сообщение #10


Участник
*

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



Цитата(_Артём_ @ Jan 13 2013, 15:13) *
Так должно быть по идее:
Код
extern "C" void __init_system_timer()
{

}



ну да... так правильнее...

только у меня компилятор не подхватывает директиву "weak"

Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 13 2013, 16:39
Сообщение #11


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

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



Цитата(Посторонним В... @ Jan 13 2013, 20:48) *
я свою написал... на базе примера... с использованием стандартных либов и подключил при инициализации железа...
после инициализации клоков...

Но зачем? Я понимаю, если нужно использовать другой таймер. А для этого-то зачем?
Тем более, ваша инициализация всё равно не полная, вы не задаёте приоритет прерывания. (У вас, емнип, получается наивысший приоритет, вместо наинизшего).


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Посторонним В...
сообщение Jan 13 2013, 17:58
Сообщение #12


Участник
*

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



Цитата(AHTOXA @ Jan 13 2013, 16:39) *
Но зачем? Я понимаю, если нужно использовать другой таймер. А для этого-то зачем?
Тем более, ваша инициализация всё равно не полная, вы не задаёте приоритет прерывания. (У вас, емнип, получается наивысший приоритет, вместо наинизшего).


функция на асме вылетает в ХардФаулт прерывание...

тогда где искать проблему???
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 13 2013, 18:47
Сообщение #13


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

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



Попробуйте взять порт для Cortex-M4F, там эта функция не на асме. (Он совместим с M3, советую переключиться на него совсем.)


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Посторонним В...
сообщение Jan 14 2013, 02:08
Сообщение #14


Участник
*

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



Цитата(AHTOXA @ Jan 13 2013, 18:47) *
Попробуйте взять порт для Cortex-M4F, там эта функция не на асме. (Он совместим с M3, советую переключиться на него совсем.)

попробуем...
Go to the top of the page
 
+Quote Post
Посторонним В...
сообщение Jan 15 2013, 14:14
Сообщение #15


Участник
*

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



Цитата(AHTOXA @ Jan 13 2013, 18:47) *
Попробуйте взять порт для Cortex-M4F, там эта функция не на асме. (Он совместим с M3, советую переключиться на него совсем.)


попробовал - не получилось...
Go to the top of the page
 
+Quote Post

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

 


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


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