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

 
 
> 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
 
Start new topic
Ответов
Посторонним В...
сообщение 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
AHTOXA
сообщение Jan 13 2013, 00:44
Сообщение #3


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

Группа: Свой
Сообщений: 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
Посторонним В...
сообщение Jan 13 2013, 14:48
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 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
AHTOXA
сообщение Jan 13 2013, 16:39
Сообщение #5


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

Группа: Свой
Сообщений: 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
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 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
Сообщение #7


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

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



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


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


Участник
*

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



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

попробуем...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Посторонним В...   stm32l1xx и scmRtos4 (cortex-m3)   Jan 12 2013, 20:01
|- - _Артём_   Цитата(Посторонним В... @ Jan 12 2013, 23...   Jan 13 2013, 00:39
|- - Tiro   Цитата(AHTOXA @ Jan 13 2013, 03:44) ЗЫ. О...   Jan 13 2013, 01:45
|- - _Артём_   Цитата(Посторонним В... @ Jan 13 2013, 16...   Jan 13 2013, 15:13
||- - Посторонним В...   Цитата(_Артём_ @ Jan 13 2013, 15:13) Так ...   Jan 13 2013, 15:22
||- - Посторонним В...   Цитата(AHTOXA @ Jan 13 2013, 18:47) Попро...   Jan 15 2013, 14:14
||- - AHTOXA   Очень странно. В плане шаманства... попробуйте зам...   Jan 15 2013, 14:49
||- - Vasya777   Цитата(AHTOXA @ Jan 15 2013, 20:49) Очень...   Jan 15 2013, 15:37
||- - AHTOXA   Во втором варианте - да.   Jan 15 2013, 16:41
|- - DmitryM   Цитата(Посторонним В... @ Jan 13 2013, 21...   Jan 15 2013, 18:33
- - Vasya777   Тоесть любой таймер можно сделать системным?   Jan 13 2013, 07:00
- - AHTOXA   Да, можно.   Jan 13 2013, 11:13


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

 


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


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