Hi,
I need to have port for IAR compiler for AVR micros, if any one has a port, kindly share it with me.
is there any plans from ChibiOS development team to make one?
if there is no port, I will make one.
I need to know the usage of function _port_thread_start as I found it defined in every port, but when I searched the code I didn't find any usage for it, do I miss something?
thanks.
IAR AVR Port
-
- Posts: 417
- Joined: Tue Dec 21, 2010 10:19 am
- Location: Karlsruhe, Germany
- Been thanked: 1 time
- Contact:
Re: IAR AVR Port
I've not yet heart of any IAR AVR port. Isn't the AVR world mostly governed by gcc based toolchains? Even AVR Studio uses gcc - and there are even standard linker scripts. Also avr-gcc is included in every Linux distribution. Just wondering why...
- Giovanni
- Site Admin
- Posts: 14457
- Joined: Wed May 27, 2009 8:48 am
- Location: Salerno, Italy
- Has thanked: 1076 times
- Been thanked: 922 times
- Contact:
Re: IAR AVR Port
Hi,
_port_thread_start is the trampoline code that is used to start a thread. I don't have plans for an IAR port but it should very easy to do starting from the GCC code.
Giovanni
_port_thread_start is the trampoline code that is used to start a thread. I don't have plans for an IAR port but it should very easy to do starting from the GCC code.
Giovanni
Re: IAR AVR Port
I don't want to start a thread about GCC but lets say that I have bad experience with GCC, with all my respects to it, but GCC behave strangely when optimization -os is used, look at http://forums.adafruit.com/viewtopic.php?f=11&t=4343 as a small example,I also faced many of these problems, I don't want to spend time on these kind of problems again.
kindly I am still need answers for my questions in my first post.
regards.
kindly I am still need answers for my questions in my first post.
regards.
- Giovanni
- Site Admin
- Posts: 14457
- Joined: Wed May 27, 2009 8:48 am
- Location: Salerno, Italy
- Has thanked: 1076 times
- Been thanked: 922 times
- Contact:
Re: IAR AVR Port
Giovanni wrote:Hi,
_port_thread_start is the trampoline code that is used to start a thread. I don't have plans for an IAR port but it should very easy to do starting from the GCC code.
Giovanni
I posted just before you, do you need more details?
Giovanni
Re: IAR AVR Port
thank you Mr. Giovanni for answering my questions.
kindly I need more information.
I noticed that Chibios is different than other RTOS by providing two ways for context switching, one from interrupt and other by calling OS APIs like chThdSleep, this way makes chibios faster in context switching as it does not have to wait time tick interrupt or use software interrupt to make context switch, am I right in this conclusion?
but to do this, I found that port_switch save group of registers while PORT_IRQ_PROLOGUE save another group registers, and I noticed this in all ports.
my questions is how to decide which registers to save in port_switch[/b and what to save in [b]PORT_IRQ_PROLOGUE ?
I am asking this because IAR avr is different than GCC as it have two stacks and different parameter register assignment.
kindly I need more information.
I noticed that Chibios is different than other RTOS by providing two ways for context switching, one from interrupt and other by calling OS APIs like chThdSleep, this way makes chibios faster in context switching as it does not have to wait time tick interrupt or use software interrupt to make context switch, am I right in this conclusion?
but to do this, I found that port_switch save group of registers while PORT_IRQ_PROLOGUE save another group registers, and I noticed this in all ports.
my questions is how to decide which registers to save in port_switch[/b and what to save in [b]PORT_IRQ_PROLOGUE ?
I am asking this because IAR avr is different than GCC as it have two stacks and different parameter register assignment.
- Giovanni
- Site Admin
- Posts: 14457
- Joined: Wed May 27, 2009 8:48 am
- Location: Salerno, Italy
- Has thanked: 1076 times
- Been thanked: 922 times
- Contact:
Re: IAR AVR Port
Hi,
You are correct in you assumption, this is one of the things that make ChibiOS particularly efficient at switching tasks.
It is very simple, in port_switch() you save the registers that are preserved during function calls, it is useless to save the others because the compiler expects them altered anyway. This set of registers are described by the intctx structure.
In the interrupt handler you usually save the other registers instead but you have to verify what the IAR compiler exactly saves in ISR functions exactly and populate the extctx structure with those registers.
Giovanni
You are correct in you assumption, this is one of the things that make ChibiOS particularly efficient at switching tasks.
It is very simple, in port_switch() you save the registers that are preserved during function calls, it is useless to save the others because the compiler expects them altered anyway. This set of registers are described by the intctx structure.
In the interrupt handler you usually save the other registers instead but you have to verify what the IAR compiler exactly saves in ISR functions exactly and populate the extctx structure with those registers.
Giovanni
Re: IAR AVR Port
Hi Mr Giovani,
thank you too much as your answers helped me to finish the context switch on IAR AVR although it was very tricky as it took me 3 days because IAR AVR uses two stacks Cstack and Rstack.
when I try to include the HAL, the code does not compile, is the HAl Generic or it depend on AVR GCC?
also I followed your way in STM8s port to define PORT_IRQ_HANDLER, but the compiler does not accept it and the only way to compile and run is to add __ pragma and __interrupt directly to the timer ISR function in the board, how can I fix it as I need to follow the template?
regards.
thank you too much as your answers helped me to finish the context switch on IAR AVR although it was very tricky as it took me 3 days because IAR AVR uses two stacks Cstack and Rstack.
when I try to include the HAL, the code does not compile, is the HAl Generic or it depend on AVR GCC?
also I followed your way in STM8s port to define PORT_IRQ_HANDLER, but the compiler does not accept it and the only way to compile and run is to add __ pragma and __interrupt directly to the timer ISR function in the board, how can I fix it as I need to follow the template?
regards.
- Giovanni
- Site Admin
- Posts: 14457
- Joined: Wed May 27, 2009 8:48 am
- Location: Salerno, Italy
- Has thanked: 1076 times
- Been thanked: 922 times
- Contact:
Re: IAR AVR Port
Hi,
The HAL itself is generic but the driver implementations use the AVRGCC headers, you may need to make changes there if you want drivers compilable with GCC and IAR. Note that in most other platforms drivers are written to be compatible with all compilers.
About ISRs, you should try to encapsulate all the details into the macros or your ISRs will not be compatible across the various compilers. Can you post an example of ISR?
Giovanni
The HAL itself is generic but the driver implementations use the AVRGCC headers, you may need to make changes there if you want drivers compilable with GCC and IAR. Note that in most other platforms drivers are written to be compatible with all compilers.
About ISRs, you should try to encapsulate all the details into the macros or your ISRs will not be compatible across the various compilers. Can you post an example of ISR?
Giovanni
Re: IAR AVR Port
hi,
here is the example of timer0 compare interrupt.
and here is the Macro I made but the compiler refuse it.
here is the example of timer0 compare interrupt.
Code: Select all
#pragma vector = TIMER0_COMP_vect
__interrupt void TIMER0_COMP_vect_ISR(void)
{
CH_IRQ_PROLOGUE();
chSysLockFromIsr();
chSysTimerHandlerI();
chSysUnlockFromIsr();
CH_IRQ_EPILOGUE();
}
and here is the Macro I made but the compiler refuse it.
Code: Select all
#define STRINGVECTOR(x) #x
#define VECTOR_ID(x) STRINGVECTOR(vector=(x))
/**
* @brief IRQ handler function declaration.
* @note @p id can be a function name or a vector number depending on the
* port implementation.
*/
#define PORT_IRQ_HANDLER(id) \
_Pragma(VECTOR_ID(id)) \
__interrupt void vector##id(void)
Who is online
Users browsing this forum: No registered users and 31 guests