IAR PowerPac RTOS User Guide
IAR PowerPac RTOS User Guide IAR PowerPac RTOS User Guide
USING A DIFFERENT TIMER TO GENERATE THE TICK-INTERRUPTS FOR IAR POWERPAC RTOSRelevant routinesOS_ InitHW()IAR PowerPac RTOS usually generates 1 interrupt per ms, making the timer-interrupt, or tick, normally equal to 1 ms.This is done by a timer initialized in the routine OS_InitHW(). If you have to use a different timer for your application,you must modify OS_InitHW() to initialize the appropriate timer. For details about initialization, read the commentsin RTOSInit.c.CHANGING THE TICK FREQUENCYRelevant definesOS_FSYSAs noted above, IAR PowerPac RTOS usually generates 1 interrupt per ms. OS_FSYS defines the clock frequency ofyour system in Hz (times per second). The value of OS_FSYS is used for calculating the desired reload counter valuefor the system timer for 1000 interrupts/sec. The interrupt frequency is therefore normally 1 kHz.Different (lower or higher) interrupt rates are possible. If you choose an interrupt frequency different from 1 kHz, thevalue of the time variable OS_Time will no longer be equivalent to multiples of 1 ms. However, if you use a multipleof 1 ms as tick time, the basic time unit can be made 1 ms by using the (optional) configuration macro OS_CONFIG().The basic time unit does not have to be 1 ms; it might just as well be 100 µs or 10 ms or any other value. For mostapplications, 1 ms is an appropriate value.OS_CONFIG()OS_CONFIG() can be used for configuration of IAR PowerPac RTOS in situations where the basic timer-interruptinterval (tick) is a multiple of 1 ms and the time values for delays still should use 1 ms as the time base. OS_CONFIG()tells IAR PowerPac RTOS how many system time units expire per IAR PowerPac RTOS tick and what the systemfrequency is.Examples4 The following will increment the time variable OS_Time by 1 per RTOS timer-interrupt. This is the default for IARPowerPac RTOS, so usage of OS_CONFIG() is not required.OS_CONFIG(8000000,8000); /* Configure OS : System-frequency, ticks/int */5 The following will increment the time variable OS_Time by 2 per IAR PowerPac RTOS timer-interrupt.OS_CONFIG(8000000,16000); /* Configure OS : System-frequency, ticks/int */If, for example, the basic timer was initialized to 500 Hz, which would result in an IAR PowerPac RTOS timer-interruptevery 2 ms, a call of OS_Delay(10) would result in a delay of 20 ms, because all timing values are interpreted asticks. A call of OS_CONFIG() with the parameter shown in example 2 would compensate for the difference, resultingin a delay of 10 ms when calling OS_Delay(10).STOP / HALT / IDLE modesMost CPUs support power-saving STOP, HALT, or IDLE modes. Using these types of modes is one possible way tosave power consumption during idle times. As long as the timer-interrupt will wake up the system with every IARPowerPac RTOS tick, or as long as other interrupts will activate tasks, these modes may be used for saving powerconsumption.If required, you may modify the OS_Idle() routine, which is part of the hardware-dependant module RTOSInit.c,to switch the CPU to power-saving mode during idle times. Refer to the CPU & Compiler Specific manual of embOSdocumentation for details about your processor.112IAR PowerPac RTOSfor ARM CoresPPRTOS-2
Time measurementIntroductionIAR PowerPac RTOS supports 2 types of time measurement:● Low resolution (using a time variable)● High resolution (using a hardware timer)Both are explained in this chapter.IAR PowerPac RTOS supports two basic types of run-time measurement which may be used for calculating theexecution time of any section of user code. Low-resolution measurements use a time base of ticks, while highresolutionmeasurements are based on a time unit called a cycle. The length of a cycle depends on the timer clockfrequency.Low-resolution measurementThe system time variable OS_Time is measured in ticks, or ms. The low-resolution functions OS_GetTime() andOS_GetTime32() are used for returning the current contents of this variable. The basic idea behind low-resolutionmeasurement is quite simple: The system time is returned once before the section of code to be timed and once after,and the first value is subtracted from the second to obtain the time it took for the code to execute.The term low-resolution is used because the time values returned are measured in completed ticks. Consider thefollowing: with a normal tick of 1 ms, the variable OS_Time is incremented with every tick-interrupt, or once every ms.This means that the actual system time can potentially be more than what a low-resolution function will return (forexample, if an interrupt actually occurs at 1.4 ticks, the system will still have measured only 1 tick as having elapsed).The problem becomes even greater with runtime measurement, because the system time must be measured twice. Eachmeasurement can potentially be up to 1 tick less than the actual time, so the difference between two measurementscould theoretically be inaccurate by up to two ticks.PPRTOS-2 113
- Page 61 and 62: MailboxesWhy mailboxes?In the prece
- Page 63 and 64: MailboxesMailboxes API function ove
- Page 65 and 66: MailboxesExampleSingle-byte mailbox
- Page 67 and 68: MailboxesPrototypevoid OS_GetMail (
- Page 69 and 70: MailboxesOS_WaitMail()DescriptionWa
- Page 71 and 72: QueuesWhy queues?In the preceding c
- Page 73 and 74: QueuesReturn valueThe size of the r
- Page 75 and 76: QueuesExamplestatic void MemoryTask
- Page 77 and 78: Task eventsIntroductionTask events
- Page 79 and 80: Task eventsExampleOS_WaitEventTimed
- Page 81 and 82: Task eventsPrototypechar OS_ClearEv
- Page 83 and 84: Event objectsIntroductionEvent obje
- Page 85 and 86: Event objectsExampleif (OS_EVENT_Wa
- Page 87 and 88: Event objectsExampleOS_EVENT_Reset(
- Page 89 and 90: Heap type memory managementANSI C o
- Page 91 and 92: Fixed block size memory poolsIntrod
- Page 93 and 94: Fixed block size memory poolsProtot
- Page 95 and 96: Fixed block size memory poolsProtot
- Page 97 and 98: StacksIntroductionThe stack is the
- Page 99 and 100: InterruptsIntroductionIn this chapt
- Page 101 and 102: InterruptsRules for interrupt handl
- Page 103 and 104: InterruptsOS_LeaveInterruptNoSwitch
- Page 105 and 106: InterruptsNesting interrupt routine
- Page 107 and 108: Critical RegionsIntroductionCritica
- Page 109 and 110: System variablesIntroductionThe sys
- Page 111: Configuration for your targetsystem
- Page 115 and 116: Time measurementPrototypeU32 OS_Get
- Page 117 and 118: Time measurementPrototypeOS_U32 OS_
- Page 119 and 120: RTOS-aware debuggingThis chapter de
- Page 121 and 122: RTOS-aware debuggingTimersA softwar
- Page 123 and 124: DebuggingRuntime errorsSome error c
- Page 125 and 126: DebuggingValue Define Description17
- Page 127 and 128: Performance and resource usageThis
- Page 129 and 130: Performance and resource usageThe c
- Page 131 and 132: Performance and resource usage*/sta
- Page 133 and 134: ReentranceAll routines that can be
- Page 135 and 136: LimitationsThe following limitation
- Page 137 and 138: Source code of kernel and libraryIn
- Page 139 and 140: Additional modulesKeyboard manager:
- Page 141 and 142: FAQ (frequently asked questions)Q:
- Page 143 and 144: GlossaryActive TaskCooperativemulti
- Page 145 and 146: IndexIndexAAdditional modules . . .
- Page 147: IndexOS_WaitSingleEventTimed(). . .
USING A DIFFERENT TIMER TO GENERATE THE TICK-INTERRUPTS FOR <strong>IAR</strong> POWERPAC <strong>RTOS</strong>Relevant routinesOS_ InitHW()<strong>IAR</strong> <strong>PowerPac</strong> <strong>RTOS</strong> usually generates 1 interrupt per ms, making the timer-interrupt, or tick, normally equal to 1 ms.This is done by a timer initialized in the routine OS_InitHW(). If you have to use a different timer for your application,you must modify OS_InitHW() to initialize the appropriate timer. For details about initialization, read the commentsin <strong>RTOS</strong>Init.c.CHANGING THE TICK FREQUENCYRelevant definesOS_FSYSAs noted above, <strong>IAR</strong> <strong>PowerPac</strong> <strong>RTOS</strong> usually generates 1 interrupt per ms. OS_FSYS defines the clock frequency ofyour system in Hz (times per second). The value of OS_FSYS is used for calculating the desired reload counter valuefor the system timer for 1000 interrupts/sec. The interrupt frequency is therefore normally 1 kHz.Different (lower or higher) interrupt rates are possible. If you choose an interrupt frequency different from 1 kHz, thevalue of the time variable OS_Time will no longer be equivalent to multiples of 1 ms. However, if you use a multipleof 1 ms as tick time, the basic time unit can be made 1 ms by using the (optional) configuration macro OS_CONFIG().The basic time unit does not have to be 1 ms; it might just as well be 100 µs or 10 ms or any other value. For mostapplications, 1 ms is an appropriate value.OS_CONFIG()OS_CONFIG() can be used for configuration of <strong>IAR</strong> <strong>PowerPac</strong> <strong>RTOS</strong> in situations where the basic timer-interruptinterval (tick) is a multiple of 1 ms and the time values for delays still should use 1 ms as the time base. OS_CONFIG()tells <strong>IAR</strong> <strong>PowerPac</strong> <strong>RTOS</strong> how many system time units expire per <strong>IAR</strong> <strong>PowerPac</strong> <strong>RTOS</strong> tick and what the systemfrequency is.Examples4 The following will increment the time variable OS_Time by 1 per <strong>RTOS</strong> timer-interrupt. This is the default for <strong>IAR</strong><strong>PowerPac</strong> <strong>RTOS</strong>, so usage of OS_CONFIG() is not required.OS_CONFIG(8000000,8000); /* Configure OS : System-frequency, ticks/int */5 The following will increment the time variable OS_Time by 2 per <strong>IAR</strong> <strong>PowerPac</strong> <strong>RTOS</strong> timer-interrupt.OS_CONFIG(8000000,16000); /* Configure OS : System-frequency, ticks/int */If, for example, the basic timer was initialized to 500 Hz, which would result in an <strong>IAR</strong> <strong>PowerPac</strong> <strong>RTOS</strong> timer-interruptevery 2 ms, a call of OS_Delay(10) would result in a delay of 20 ms, because all timing values are interpreted asticks. A call of OS_CONFIG() with the parameter shown in example 2 would compensate for the difference, resultingin a delay of 10 ms when calling OS_Delay(10).STOP / HALT / IDLE modesMost CPUs support power-saving STOP, HALT, or IDLE modes. Using these types of modes is one possible way tosave power consumption during idle times. As long as the timer-interrupt will wake up the system with every <strong>IAR</strong><strong>PowerPac</strong> <strong>RTOS</strong> tick, or as long as other interrupts will activate tasks, these modes may be used for saving powerconsumption.If required, you may modify the OS_Idle() routine, which is part of the hardware-dependant module <strong>RTOS</strong>Init.c,to switch the CPU to power-saving mode during idle times. Refer to the CPU & Compiler Specific manual of embOSdocumentation for details about your processor.112<strong>IAR</strong> <strong>PowerPac</strong> <strong>RTOS</strong>for ARM CoresPP<strong>RTOS</strong>-2