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

 
 
18 страниц V  « < 15 16 17 18 >  
Reply to this topicStart new topic
> Начало работы with scmRTOS, Несколько вопросиков
AHTOXA
сообщение Apr 7 2013, 16:57
Сообщение #241


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

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



SYSTICKFREQ - это частота тактирования системного таймера.
А SYSTICKINTRATE - это желаемая частота прерываний системного таймера. В герцах.
Аргумент функции sleep() - число тиков системного таймера.
То есть, скажем, если SYSTICKINTRATE = 1000, то аргумент sleep() будет в миллисекундах, и для того, чтобы проспать секунду, надо написать sleep(1000);.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
AlexG
сообщение Sep 17 2013, 09:19
Сообщение #242


Участник
*

Группа: Свой
Сообщений: 50
Регистрация: 10-05-12
Пользователь №: 71 756



При портировании scmRTOS 4.0 на Xmega возникла проблема с примером 4-Debug. Пример компилируется в IAR 6.21.1 с таким предупреждением:

Warning[w6]: Type conflict for external/entry "__near_memzero", in module debug against external/entry in module
?xxmemxmemzero; function types differ in parameter 1; types have different type attributes

Ругань компилятора вызывает контсруктор шаблонного класса TProfiler:

Код
template < uint_fast8_t sum_shift_bits >
TProfiler<sum_shift_bits>::TProfiler()
    : Counter (   )
    , Result  (   )
{
}


а именно
Код
    : Counter (   )
    , Result  (   )


Не сталкивался раньше с подобным, это баг компилятора или в коде профайлера scmRTOS что-то не учтено?

Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 17 2013, 10:02
Сообщение #243


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Поскольку в исходниках ОС нет явного вызова __near_memzero, значит его вызывает сам компилятор и значит да - это бага компилятора.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
dxp
сообщение Sep 17 2013, 13:40
Сообщение #244


Adept
******

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



QUOTE (ex_AlexG @ Sep 17 2013, 16:19) *
При портировании scmRTOS 4.0 на Xmega возникла проблема с примером 4-Debug. Пример компилируется в IAR 6.21.1 с таким предупреждением:

Warning[w6]: Type conflict for external/entry "__near_memzero", in module debug against external/entry in module
?xxmemxmemzero; function types differ in parameter 1; types have different type attributes

По всему видно, что библиотечный модуль ?xxmemxmemzero собран с другими опциями, нежели собирается проект (модуль debug). Почему так - надо смотреть настройки проекта/тулчейна, почему-то не та библиотека линкуется.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
AlexG
сообщение Sep 18 2013, 06:31
Сообщение #245


Участник
*

Группа: Свой
Сообщений: 50
Регистрация: 10-05-12
Пользователь №: 71 756



Цитата(dxp @ Sep 17 2013, 20:40) *
По всему видно, что библиотечный модуль ?xxmemxmemzero собран с другими опциями, нежели собирается проект (модуль debug). Почему так - надо смотреть настройки проекта/тулчейна, почему-то не та библиотека линкуется.


Чтобы исключить влияние каких-то неучтенных настроек создал проект заново, получил то-же самое сообщение об ошибке, но более развернутое:

Warning[w6]: Type conflict for external/entry "__near_memzero", in module debug against external/entry in module
?xxmemxmemzero; function types differ in parameter 1; types have different type attributes
/* In module debug: */
/* Function, args 2, attr 0 */
void (__version_3 __near_memzero)(void volatile *, unsigned int);
/* In module ?xxmemxmemzero: */
/* Function, args 2, attr 0 */
void (__version_3 __near_memzero)(void *, __near_size_t);
typedef unsigned int __near_size_t;

Прикладываю проект (в составе порта)
Прикрепленный файл  scmRTOS.4.00.avr.iar.xmega.zip ( 163.44 килобайт ) Кол-во скачиваний: 63
Go to the top of the page
 
+Quote Post
сарматъ
сообщение Sep 19 2013, 11:14
Сообщение #246


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

Группа: Участник
Сообщений: 153
Регистрация: 19-11-12
Пользователь №: 74 463



понимаю что не по делу но может с xмеги на арм пересесть stm32f(1/3) очень приятные изделия, последний раз когда сталкивался с аврами периферия работала совсем не так как описано в даташитах


цена практически та же но 32 разряда плюс внутрисхемная отладка плюс свободные средства разработки плюс рабочие порты
Go to the top of the page
 
+Quote Post
AlexG
сообщение Sep 20 2013, 04:13
Сообщение #247


Участник
*

Группа: Свой
Сообщений: 50
Регистрация: 10-05-12
Пользователь №: 71 756



Цитата(сарматъ @ Sep 19 2013, 18:14) *
понимаю что не по делу но может с xмеги на арм пересесть stm32f(1/3) очень приятные изделия, последний раз когда сталкивался с аврами периферия работала совсем не так как описано в даташитах

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


Зачем мне ARM? У меня и на Xmega все работает sm.gif Включая scmRTOS.

Периферия у Xmega мне нравится на порядок больше чем у STM32F1, особенно система событий позволяющая кучу работы сделать аппаратно без участия программы и встроенный EEPROM.
Внутрисхемная отладка и у AVR есть, без нее приходится отлаживать программы только для старья вроде ATmega8 и ATtiny15.
Свободные средства разработки тоже есть, не так как у STM8.
Go to the top of the page
 
+Quote Post
WHALE
сообщение Dec 9 2013, 10:33
Сообщение #248


Знающий
****

Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768



Есть несколько вопросов по scmRTOS под АРМ.

1.Вопрос по приоритетам.
При работе с АВР приоритеты без вариантов рулятся только на уровне оси.
А вот как быть с АРМ-ами?
Пока в голову приходит следующее:
Выставить всем осевым прерываниям одинаковый приоритет в контроллере прерываний,
чуть выше системного таймера.
А какой приоритет в контроллере прерываний ставить внеосевым прерываниям?

2. Я использую версию оси 3.11,т.к версии 4.0 для AT91SAM7 нет.
Для 3-й версии scmRTOS нет описания.Есть для версий 2 и 4.
Какое будет актульнее для 3-й?

3.Столкнувшись с глюками под отладчиком,к своему удивлению не обнаружил в версии 3.хх
поддержки режима отладки .Бегло глянул версию 4.0 под GCC и там не увидел тоже.
А без нее реально под jtag-ом глючит-периодически улетает неведомо куда и сваливается в исключения.
Я добавил в __low_level_init()
#ifdef DEBUG
AT91C_BASE_AIC->AIC_DCR = AT91C_AIC_DCR_PROT; // Enable Debug mode
#endif
и в cstartup.s
Код
resetVector:
        LDR     pc, =resetHandler       ; Reset                                
        LDR     pc, Undefined_Addr     ; Undefined instructions            
        LDR     pc, SWI_Addr            ; Software interrupt (SWI/SYS)        
        LDR     pc, Prefetch_Addr      ; Prefetch abort                      
        LDR     pc, Abort_Addr          ; Data abort                          
        B       .                              ; RESERVED            
        #ifdef DEBUG
       LDR     pc, =irqHandler    
        #else    
        LDR     PC,[PC,#-0x20]         ;                            
        LDR     pc, FIQ_Addr             ; FIQ


irqHandler:
        STMFD   SP!, {r5,r6,r7}         ;
        LDR     r5, =AT91C_BASE_AIC ;
        LDR     r6, [r5, #AIC_IVR]      ;  
        STR     r5, [r5, #AIC_IVR]      ;Write in the IVR to support Protect Mode
        STR     r6, [SP, #8]               ;
        LDMFD  SP!, {r5,r6,PC}

ну и в scmRTOS_config.h если нужна отладка определить #define DEBUG

С уважением.




--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Dec 9 2013, 11:17
Сообщение #249


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



Цитата(WHALE @ Dec 9 2013, 14:33) *
2. Я использую версию оси 3.11,т.к версии 4.0 для AT91SAM7 нет.
Для 3-й версии scmRTOS нет описания.Есть для версий 2 и 4.
Какое будет актульнее для 3-й?

А в trunk лежит не то, что Вам нужно? Порт только для GCC. Для отладки в 4.0 пример Debug с применением Extensions.


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
WHALE
сообщение Dec 9 2013, 11:28
Сообщение #250


Знающий
****

Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768



Цитата(mdmitry @ Dec 9 2013, 15:17) *
А в trunk лежит не то, что вам нужно? Порт только для GCC.


Я прикидывал затраты на перепиливание существующей версии 3.11 под текущий iar и портирование под IAR GCC-ный порт 4.0.
С учетом моего нулевого опыта с АРМ-ами первый вариант мне показался проще.
Но сейчас проблема не в порте,а в подходе к написанию кода.


--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post
Alex_rav(зеленин...
сообщение Feb 25 2014, 11:30
Сообщение #251


Участник
*

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



Доброго времени суток.
Давно используем ScmRTOS в своих проектах. До этого работали на LPC2148/2368/2387. В новом проекте используем LPC4330, да к тому же переходим на новую среду разработки (был IAR, а стал Eclipse+CodeSourcery). В данный момент перенес порт для Cortex-M4 в готовый, работающий проект для LPC4330. Прерывания от системного таймера и PendSV приходят, но ось раз за разом падает в HardFault. Причем падает после отработки по разу всех процессов, т.е. когда все процессы перешли в sleep. падает на строках

CODE
void TKernel::sched()
{
uint_fast8_t NextPrty = highest_priority(ReadyProcessMap);
if(NextPrty != CurProcPriority)
{
SchedProcPriority = NextPrty;

raise_context_switch();
do // <--------------------------- вот здесь
{
enable_context_switch();
DUMMY_INSTR();
disable_context_switch();
}
while(CurProcPriority != SchedProcPriority); // until context switch done
}
}


Я использую стартап и ld-скрипт от библиотеки CMSIS. С стартапом понятно, там переделал названия прерываний и все, а подскажите пожалуйста с ld-скриптом. Сейчас он выглядит вот так:

CODE

OUTPUT_FORMAT ("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
ENTRY(_start)
SEARCH_DIR(.)
GROUP(-lgcc -lc -lcs3 -lcs3unhosted -lcs3micro)

MEMORY
{
rom (rx) : ORIGIN = 0x10000000, LENGTH = 128K
ram (rwx) : ORIGIN = 0x10008000, LENGTH = 32K
}

/* These force the linker to search for particular symbols from
* the start of the link process and thus ensure the user's
* overrides are picked up
*/
EXTERN(__cs3_reset_cortex_m)
EXTERN(__cs3_interrupt_vector_cortex_m)
EXTERN(__cs3_start_c main __cs3_stack __cs3_stack_size __cs3_heap_end)

PROVIDE(__cs3_stack = __cs3_region_start_ram + __cs3_region_size_ram);
PROVIDE(__cs3_stack_size = __cs3_region_start_ram + __cs3_region_size_ram - _end);
PROVIDE(__cs3_heap_start = _end);
PROVIDE(__cs3_heap_end = __cs3_region_start_ram + __cs3_region_size_ram);

SECTIONS
{
.text :
{
CREATE_OBJECT_SYMBOLS
__cs3_region_start_rom = .;
*(.cs3.region-head.rom)
__cs3_interrupt_vector = __cs3_interrupt_vector_cortex_m;
*(.cs3.interrupt_vector)
/* Make sure we pulled in an interrupt vector. */
ASSERT (. != __cs3_interrupt_vector_cortex_m, "No interrupt vector");
*(.rom)
*(.rom.cool.gif

__cs3_reset = __cs3_reset_cortex_m;
*(.cs3.reset)
/* Make sure we pulled in some reset code. */
ASSERT (. != __cs3_reset, "No reset code");

*(.text .text.* .gnu.linkonce.t.*)
*(.plt)
*(.gnu.warning)
*(.glue_7t) *(.glue_7) *(.vfp11_veneer)

*(.rodata .rodata.* .gnu.linkonce.r.*)

*(.ARM.extab* .gnu.linkonce.armextab.*)
*(.gcc_except_table)
*(.eh_frame_hdr)
*(.eh_frame)

. = ALIGN(4);
KEEP(*(.init))

. = ALIGN(4);
__preinit_array_start = .;
KEEP (*(.preinit_array))
__preinit_array_end = .;

. = ALIGN(4);
__init_array_start = .;
KEEP (*(SORT(.init_array.*)))
KEEP (*(.init_array))
__init_array_end = .;

. = ALIGN(0x4);
KEEP (*crtbegin.o(.ctors))
KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))
KEEP (*(SORT(.ctors.*)))
KEEP (*crtend.o(.ctors))

. = ALIGN(4);
KEEP(*(.fini))

. = ALIGN(4);
__fini_array_start = .;
KEEP (*(.fini_array))
KEEP (*(SORT(.fini_array.*)))
__fini_array_end = .;

KEEP (*crtbegin.o(.dtors))
KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))
KEEP (*(SORT(.dtors.*)))
KEEP (*crtend.o(.dtors))

. = ALIGN(4);
__cs3_regions = .;
LONG (0)
LONG (__cs3_region_init_ram)
LONG (__cs3_region_start_ram)
LONG (__cs3_region_init_size_ram)
LONG (__cs3_region_zero_size_ram)
}

/* .ARM.exidx is sorted, so has to go in its own output section. */
__exidx_start = .;
.ARM.exidx :
{
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
} >rom
__exidx_end = .;
.text.align :
{
. = ALIGN(8);
_etext = .;
} >rom
__cs3_region_size_rom = LENGTH(rom);
__cs3_region_num = 1;

.data :
{
__cs3_region_start_ram = .;
*(.cs3.region-head.ram)
KEEP(*(.jcr))
*(.got.plt) *(.got)
*(.shdata)
*(.data .data.* .gnu.linkonce.d.*)
*(.ram)
. = ALIGN (8);
_edata = .;
} >ram AT>rom
.bss :
{
__bss_start__ = .;
*(.shbss)
*(.bss .bss.* .gnu.linkonce.b.*)
*(COMMON)
*(.ram.cool.gif
. = ALIGN (8);
_end = .;
__end = .;
__bss_end__ = .;
} >ram AT>rom
.heap :
{
*(.heap)
} >ram
.stack (__cs3_stack - __cs3_stack_size) :
{
*(.stack)
} >ram
__cs3_region_init_ram = LOADADDR (.data);
__cs3_region_init_size_ram = _edata - __cs3_region_start_ram;
__cs3_region_zero_size_ram = _end - _edata;
__cs3_region_size_ram = LENGTH(ram);
__cs3_region_num = 1;

.stab 0 (NOLOAD) : { *(.stab) }
.stabstr 0 (NOLOAD) : { *(.stabstr) }
/* DWARF debug sections.
* Symbols in the DWARF debugging sections are relative to the beginning
* of the section so we begin them at 0. */
/* DWARF 1 */
.debug 0 : { *(.debug) }
.line 0 : { *(.line) }
/* GNU DWARF 1 extensions */
.debug_srcinfo 0 : { *(.debug_srcinfo) }
.debug_sfnames 0 : { *(.debug_sfnames) }
/* DWARF 1.1 and DWARF 2 */
.debug_aranges 0 : { *(.debug_aranges) }
.debug_pubnames 0 : { *(.debug_pubnames) }
/* DWARF 2 */
.debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
.debug_abbrev 0 : { *(.debug_abbrev) }
.debug_line 0 : { *(.debug_line) }
.debug_frame 0 : { *(.debug_frame) }
.debug_str 0 : { *(.debug_str) }
.debug_loc 0 : { *(.debug_loc) }
.debug_macinfo 0 : { *(.debug_macinfo) }
/* SGI/MIPS DWARF 2 extensions */
.debug_weaknames 0 : { *(.debug_weaknames) }
.debug_funcnames 0 : { *(.debug_funcnames) }
.debug_typenames 0 : { *(.debug_typenames) }
.debug_varnames 0 : { *(.debug_varnames) }

.note.gnu.arm.ident 0 : { KEEP (*(.note.gnu.arm.ident)) }
.ARM.attributes 0 : { KEEP (*(.ARM.attributes)) }
/DISCARD/ : { *(.note.GNU-stack) }
}


Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 25 2014, 11:46
Сообщение #252


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Alex_rav(зеленинький я есть) @ Feb 25 2014, 13:30) *
Причем падает после отработки по разу всех процессов, т.е. когда все процессы перешли в sleep.
У меня такое поведение наблюдается когда обработчик прерывания системного таймера не попадает в таблицу векторов и вместо него попадает либо 0 либо default_handler.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Alex_rav(зеленин...
сообщение Feb 25 2014, 12:54
Сообщение #253


Участник
*

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



Странно, но в Hardfault падает после перехода в процесс TIdleProc.

CODE

template<> void TIdleProc::exec()
{
for(;;)
{
#if scmRTOS_IDLE_HOOK_ENABLE == 1
idle_process_user_hook(); \\ <------------------заходит сюда и потом падает в HardFault
#endif

#if scmRTOS_TARGET_IDLE_HOOK_ENABLE == 1
idle_process_target_hook();
#endif
}
}


Прерывания системного таймера происходят, вижу это в отладчике. Чувствую что где-то что-то просто пропустил при переносе, но не пойму пока что.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 25 2014, 13:05
Сообщение #254


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



idle_process_user_hook() - ваша функция. Может стека для TIdleProc мало выделили и она складывая в стек содержимое LR что-то портит?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Alex_rav(зеленин...
сообщение Feb 26 2014, 12:47
Сообщение #255


Участник
*

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



Цитата(Сергей Борщ @ Feb 25 2014, 17:05) *
idle_process_user_hook() - ваша функция. Может стека для TIdleProc мало выделили и она складывая в стек содержимое LR что-то портит?


Размер для стека :

CODE
#define scmRTOS_IDLE_PROCESS_STACK_SIZE (100 * sizeof(stack_item_t))


Мне тоже кажется что что-то не ладно со стеком. Буду разбираться с скриптами и памятью.
Go to the top of the page
 
+Quote Post

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

 


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


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