mirror of
https://github.com/azure-rtos/threadx
synced 2025-02-06 08:08:27 +08:00
278 lines
7.9 KiB
Plaintext
278 lines
7.9 KiB
Plaintext
Azure RTOS' OSEK compatibility layer for ThreadX
|
||
|
||
1. Installation
|
||
|
||
The OSEK compatibility layer for ThreadX is comprised of two files tx_osek.c and os.h
|
||
which should be copied at a suitable location for inclusion into a ThreadX project. Refer
|
||
to the ThreadX readme file for installation instructions for ThreadX.
|
||
|
||
|
||
2. Building
|
||
|
||
Building the OSEK layer should be as simple as including the tx_osek.c and os.h file to
|
||
an existing ThreadX project, making sure that the location of the os.h header is in the
|
||
include paths. The OSEK layer requires that the ThreadX headers such as tx_api.h are
|
||
reachable in the include paths as well.
|
||
|
||
|
||
3. Initialization
|
||
|
||
The OSEK layer initialization can be performed either from the tx_application_define()
|
||
during the ThreadX initialization or from a running ThreadX thread. It is strongly
|
||
recommended to initialize and start the OSEK layer as soon as possible. Once started
|
||
other ThreadX tasks and API call should not be used to prevent resource conflicts with
|
||
OSEK.
|
||
|
||
The OSEK initialization has three phases. First the osek internal initialization which
|
||
must be performed before calling any other OSEK API functions, by calling
|
||
osek_initialize() passing it a pointer to the OSEK memory and the application structure.
|
||
The size of the memory region passed to osek_initialize() must be set at compile time
|
||
by adjusting the OSEK_MEMORY_SIZE define in osek_uart.h.
|
||
|
||
After having initialized the OSEK internally, the application can now create OSEK objects
|
||
and link or assigned them as needed. See below for a list of object creation functions.
|
||
|
||
Finally, after all the objects are created and configured the OSEK layer can be started
|
||
using StartOS(). Once started it is no longer possible to create or change any OSEK
|
||
objects.
|
||
|
||
|
||
4. OSEK shutdown and restart
|
||
|
||
The OSEK layer can be shutdown using the standard OSEK API ShutdownOS(). As an extension
|
||
to the OSEK layer offers an osek_cleanup() function which can be used to cleanup and
|
||
reset the OSEK layer allowing a subsequent restart without having to reset the CPU. This
|
||
is primarily intended for testing.
|
||
|
||
|
||
5. Hooks
|
||
|
||
The various hook routines available within OSEK can be set during initialization by
|
||
setting the various handler members of the APPLICATION_INFO structure passed to
|
||
osek_initialize(). See the OSEK documentation for the signature of those hook functions.
|
||
|
||
For example:
|
||
|
||
app.error_hook_handler = ErrorHook;
|
||
app.startup_hook_handler = StartupHook;
|
||
app.shutdown_hook_handler = ShutdownHook;
|
||
app.pretask_hook_handler = PreTaskHook;
|
||
app.posttask_hook_handler = PostTaskHook;
|
||
|
||
|
||
6. Interrupts
|
||
|
||
As per the OSEK specification, category 1 ISRs are not affected by the OSEK layer
|
||
execution and are not allowed to call any of the OSEK API. Those ISR are configured and
|
||
processed just like any other interrupts under ThreadX. Category 2 ISR have to be
|
||
created using CreateISR() as well as being registered and enable like a category 1 ISR.
|
||
In the body of the low level ISR process_ISR2() must be called with the return value of
|
||
the corresponding CreateISR() in argument. This will instruct the OSEK layer to schedule
|
||
the category 2 ISR as soon as possible.
|
||
|
||
A category 2 ISR is made of two handlers, the one that process the hardware interrupt
|
||
and the OSEK ISR body.
|
||
|
||
To define a category 2 ISR body use the standard ISR() macro as follows:
|
||
|
||
|
||
ISRType DemoISR; /* ISR declaration. */
|
||
|
||
/* ISR body definition. */
|
||
ISR(DemoISR)
|
||
{
|
||
/* ISR body. */
|
||
}
|
||
|
||
|
||
This ISR should be created during system initialization:
|
||
|
||
|
||
DemoISR = CreateISR("Demo ISR", ISREntry(DemoISR), CATEGORY2, 1024);
|
||
|
||
|
||
Once properly initialized the ISR can be triggered by calling process_ISR2 with the ISR
|
||
name in argument from within the hardware ISR handler.
|
||
|
||
|
||
void demo_isr_hardware_handler(void)
|
||
{
|
||
/* Call OSEK to process the ISR. */
|
||
process_ISR2(DemoISR);
|
||
}
|
||
|
||
|
||
7. Implementation specific information
|
||
|
||
Since OSEK requires a static allocation methodology, the number of available OSEK object
|
||
has to be limited at compile time. By default the following limits apply:
|
||
|
||
Maximum number of tasks: 32
|
||
Maximum number of internal resources: 8
|
||
Maximum number of external resources: 16
|
||
Maximum number of alarms: 16
|
||
Maximum number of counters: 16
|
||
Maximum number of events: 32
|
||
Maximum number of category 2 ISRs: 8
|
||
Minimum OSEK task priority: 0
|
||
Maximum OSEK task priority: 23
|
||
Maximum alarm counter value: 0x7FFFFFFFUL
|
||
Maximum task activation count: 8
|
||
|
||
8. Supported OSEK API
|
||
|
||
The ThreadX OSEK layer supports all the mandatory APIs specified in version 2.2.3 of
|
||
the OSEK/VDK Operating System Specification.
|
||
|
||
Summary of the supported API, see the OSEK specification and tx_osek.c for the full
|
||
details of each API.
|
||
|
||
TASK MANAGEMENT
|
||
|
||
DeclareTask
|
||
ActivateTask
|
||
TerminateTask
|
||
ChainTask
|
||
Schedule
|
||
GetTaskID
|
||
GetTaskState
|
||
|
||
INTERRUPT HANDLING
|
||
|
||
EnableAllInterrupts
|
||
DisableAllInterrupts
|
||
ResumeAllInterrupts
|
||
SuspendAllInterrupts
|
||
ResumeOSInterrupts
|
||
SuspendOSInterrupts
|
||
|
||
RESOURCE MANAGEMENT
|
||
|
||
DeclareResource
|
||
GetResource
|
||
ReleaseResource
|
||
|
||
EVENT CONTROL
|
||
|
||
DeclareEvent
|
||
SetEvent
|
||
ClearEvent
|
||
GetEvent
|
||
WaitEvent
|
||
|
||
ALARMS
|
||
|
||
DeclareAlarm
|
||
GetAlarmBase
|
||
GetAlarm
|
||
SetRelAlarm
|
||
SetAbsAlarm
|
||
CancelAlarm
|
||
|
||
EXECUTION CONTROL
|
||
|
||
GetActiveApplicationMode
|
||
StartOS
|
||
ShutdownOS
|
||
|
||
Hook Routines
|
||
|
||
ErrorHook
|
||
PreTaskHook
|
||
PostTaskHook
|
||
StartupHook
|
||
ShutdownHook
|
||
|
||
9. Object creation API
|
||
|
||
The various object creation and registration functions are as follows. See tx_osek.c for a
|
||
detailed description of each function.
|
||
|
||
----
|
||
CreateTask <20> Creates an OSEK task, the task is returned if successful.
|
||
|
||
TaskType CreateTask(CHAR *name,
|
||
void(*entry_function)(),
|
||
UINT priority,
|
||
UINT max_activation,
|
||
ULONG stack_size,
|
||
SCHEDULE policy,
|
||
AUTOSTART start,
|
||
UINT type,
|
||
AppModeType mode);
|
||
|
||
|
||
----
|
||
CreateResource - Creates an OSEK resource, the resource is returned if successful.
|
||
|
||
ResourceType CreateResource(const CHAR *name,
|
||
StatusType type,
|
||
ResourceType linked_res);
|
||
|
||
|
||
----
|
||
RegisterTasktoResource - Registers a task to a resource. The resource will be accessible
|
||
by the registered task.
|
||
|
||
StatusType RegisterTasktoResource(ResourceType Resource,
|
||
TaskType TaskID);
|
||
|
||
|
||
----
|
||
CreateEvent - Creates an event, the created event is returned if successful. Note that
|
||
per the OSEK specification an absolute maximum of 32 events can be created.
|
||
|
||
EventMaskType CreateEvent(void);
|
||
|
||
|
||
----
|
||
RegisterEventtoTask - Register an event to a task. The event is now usable from that
|
||
task. Note that an event can only be registered to a single task.
|
||
|
||
StatusType RegisterEventtoTask(EventType eventid,
|
||
TaskType TaskID);
|
||
|
||
|
||
----
|
||
CreateISR - Creates an ISR.
|
||
|
||
ISRType CreateISR(const CHAR *name,
|
||
void(*entry_function)(),
|
||
UINT category,
|
||
ULONG stack_size);
|
||
|
||
|
||
----
|
||
RegisterISRtoResource - Register an ISR to a resource. Note that ISR cannot be registered
|
||
to category 1 ISRS.
|
||
|
||
StatusType RegisterISRtoResource(ResourceType Resource,
|
||
ISRType ISRID);
|
||
|
||
|
||
----
|
||
CreateCounter - Creates a new counter.
|
||
|
||
CounterType CreateCounter(CHAR *name,
|
||
TickType max_allowed_value,
|
||
TickType ticks_per_base,
|
||
TickType min_cycle,
|
||
TickType start_value);
|
||
|
||
----
|
||
DefineSystemCounter - Assign a counter to be used as the system counter.
|
||
|
||
StatusType DefineSystemCounter(CounterType cntr);
|
||
|
||
---
|
||
CreateAlarm - Creates an alarm.
|
||
|
||
AlarmType CreateAlarm(CHAR *name,
|
||
CounterType cntr,
|
||
UINT action,
|
||
ULONG events,
|
||
TaskType task,
|
||
void (*callback)(),
|
||
UINT Startup, TickType Alarmtime,
|
||
TickType Cycle);
|