There are two things to take care of when porting to a Cortex-R or Cortex-A - porting to the processor core and porting to the interrupt controller. If your device uses an ARM GIC (generic interrupt controller) then chose a port that also uses a GIC as a base for your new port - then you might just have to change the base address of the GIC registers for it to work. If your device has a propriatory interrupt controller then you will need to do a little more work. The following pages document the differences for the Cortex-A, but the same holds for the Cortex-R:
I have been able to port the required files to the processor that i want to use (Cortex R5). Now when i create a set of timer tasks and then call the scheduler, it does not execute any of the timers callback functions, just keeps going at the start scheduler task. Can you please let me know what i could be missing for this to happen.
Please let me know if you require more information.
Does the first task start? You can test that by creating one task at
the highest priority (configMAX_PRIORITIES - 1), ensuring
configUSE_TIMERS is set to 0 (so the timer task is not the highest
priority task - you can set it back to 1 afterward), and putting a break
point at the start of the task.
Also, does the processor you use have a standard ARM GIC (generic
interrupt controller) or a device specific interrupt controller?
I did some more debug and see that the following code
vTaskDelayUntil( &xNextWakeTime, xPeriod );
Is where the system breaks. If i step through the code, things work fine, but, if i let it run, the above line is where my code crashes and the program goes to the HW watch dog.
Please let me know if you require more information.
I’m afraid all I can suggest is that you step through the code in the
debugger to see exactly what happens when the crash (if that is what it
is) occurs - I can only make guesses from here (for example, could be
the processor is in the wrong mode when you try a context switch, could
be that the context switch handler is not installed, etc.).
You comment with the debugger makes me suspicious because I ran into trouble with this call
vTaskDelayUntil() is rather funny (I dislike the function immensely) it returns immediately if your xNextWakeTime has already elapsed it does not wait xPeriod. It is listed in the API documentation
It should be noted that vTaskDelayUntil() will return immediately (without blocking) if it is used to specify a wake time that is already in the past.
Does your code properly allow for that behaviour?
Where I came unstuck was I set the value a long way before I used the function and a tick occured and the function would immediately exit. I remade my own procedure because I found the whole function clunky.
I guess what the problem is more the concept of absolute time in a task switching enviroment.
You can easily get a series of high priority pre-empts that suddenly makes your time past.
I conceed in the simplest examples and if your tasks don’t stall it will work correctly.
Peripheral delays which may require long timeouts etc in real world complex examples however make it easy to end up in past time.
What I changed the function was what is often required more required in a complex system a minimum to maximum delay. Calling with a time past invokes the minimum delay (0 allows the current behaviour as is) and your maximum delay being the timeout as now.
The call may then be used in situations where hardware etc requires a minimum delay regardless of how past the time is. So you can more tailor the behaviour to what is required.
So I guess the addition of the extra variable gives me the ability to run the function as is or in the new minimum delay mode.
The choice between using vTaskDelay and vTaskDelayUntil is that the first is designed to delay for a certain time period from NOW, while the second is designed to delay for a certain time period from the point when the last vTaskDelayUntil call ended, so as to attempt to maintain (at least on a semi-long term) a constant rate of operations.
If you make a delay of 10 ms, then both will nominally give you 100 cycles per second. Using vTaskDelay, if the system gets busy, the rate may drop, but you will always have about 10ms (at least within 1 tick worth) between delays, If you use vTaskDelayUntil, then if the system gets busy and you fall behind, the loop will do catch cycles with no delay to try and catch up,
Which behavior is ‘right’ is very much application dependant. If you are looking for an actually minimum delay at the moment, then vTaskDelay is what you want, not vTaskDelayUntil. The main use of vTaskDelayUntil is for ‘Timekeeping’ operations.
In fact, I may have a big loop with a vTaskDelayUntil as a gatekeeper for overal rate, but also have in the loop vTaskDelays when in the processing of the big loop, I need shorted delays.