Update the SAM4L low power demo to use the ASF enable/disable interrupts functions rather than manipulating the PIRMASK directly - and in so doing allow other ASF functions to be called with the interrupt enable bit nesting.

This commit is contained in:
Richard Barry 2013-11-11 14:49:36 +00:00
parent 0cd79ad81d
commit 8320dfb885
2 changed files with 15 additions and 20 deletions

View file

@ -18,7 +18,7 @@
<ToolchainFlavour>Native</ToolchainFlavour> <ToolchainFlavour>Native</ToolchainFlavour>
<KeepTimersRunning>true</KeepTimersRunning> <KeepTimersRunning>true</KeepTimersRunning>
<OverrideVtor>false</OverrideVtor> <OverrideVtor>false</OverrideVtor>
<OverrideVtorValue /> <OverrideVtorValue>exception_table</OverrideVtorValue>
<eraseonlaunchrule>1</eraseonlaunchrule> <eraseonlaunchrule>1</eraseonlaunchrule>
<AsfVersion>3.5.1</AsfVersion> <AsfVersion>3.5.1</AsfVersion>
<AsfFrameworkConfig> <AsfFrameworkConfig>
@ -135,12 +135,8 @@
<avrtool>com.atmel.avrdbg.tool.samice</avrtool> <avrtool>com.atmel.avrdbg.tool.samice</avrtool>
<com_atmel_avrdbg_tool_samice> <com_atmel_avrdbg_tool_samice>
<ToolType>com.atmel.avrdbg.tool.samice</ToolType> <ToolType>com.atmel.avrdbg.tool.samice</ToolType>
<ToolName>J-Link-OB-SAM3U128</ToolName> <ToolName>J-Link</ToolName>
<ToolNumber>000480008435</ToolNumber> <ToolNumber>000480008423</ToolNumber>
<KeepTimersRunning>true</KeepTimersRunning>
<OverrideVtor>false</OverrideVtor>
<OverrideVtorValue>
</OverrideVtorValue>
<Channel> <Channel>
<host>127.0.0.1</host> <host>127.0.0.1</host>
<port>1882</port> <port>1882</port>
@ -158,13 +154,13 @@
<JtagDevicesAfter>0</JtagDevicesAfter> <JtagDevicesAfter>0</JtagDevicesAfter>
<JtagInstrBitsBefore>0</JtagInstrBitsBefore> <JtagInstrBitsBefore>0</JtagInstrBitsBefore>
<JtagInstrBitsAfter>0</JtagInstrBitsAfter> <JtagInstrBitsAfter>0</JtagInstrBitsAfter>
<SwdClock>4000000</SwdClock> <SwdClock>32000</SwdClock>
</InterfaceProperties> </InterfaceProperties>
</ToolOptions> </ToolOptions>
</com_atmel_avrdbg_tool_samice> </com_atmel_avrdbg_tool_samice>
<CacheFlash>true</CacheFlash> <CacheFlash>true</CacheFlash>
<ProgFlashFromRam>true</ProgFlashFromRam> <ProgFlashFromRam>true</ProgFlashFromRam>
<RamSnippetAddress /> <RamSnippetAddress>0x20000000</RamSnippetAddress>
<UncachedRange /> <UncachedRange />
<BootSegment>2</BootSegment> <BootSegment>2</BootSegment>
</PropertyGroup> </PropertyGroup>
@ -212,7 +208,7 @@
<armgcc.compiler.optimization.OtherFlags>-fdata-sections</armgcc.compiler.optimization.OtherFlags> <armgcc.compiler.optimization.OtherFlags>-fdata-sections</armgcc.compiler.optimization.OtherFlags>
<armgcc.compiler.optimization.PrepareFunctionsForGarbageCollection>True</armgcc.compiler.optimization.PrepareFunctionsForGarbageCollection> <armgcc.compiler.optimization.PrepareFunctionsForGarbageCollection>True</armgcc.compiler.optimization.PrepareFunctionsForGarbageCollection>
<armgcc.compiler.warnings.AllWarnings>True</armgcc.compiler.warnings.AllWarnings> <armgcc.compiler.warnings.AllWarnings>True</armgcc.compiler.warnings.AllWarnings>
<armgcc.compiler.miscellaneous.OtherFlags>-std=gnu99 -D__ATSAM4LC4C__ -D__ATSAM4LC4C__ -D__ATSAM4LC4C__ -D__ATSAM4LC4C__</armgcc.compiler.miscellaneous.OtherFlags> <armgcc.compiler.miscellaneous.OtherFlags>-std=gnu99 -D__ATSAM4LC4C__ -D__ATSAM4LC4C__ -D__ATSAM4LC4C__ -D__ATSAM4LC4C__ -D__ATSAM4LC4C__</armgcc.compiler.miscellaneous.OtherFlags>
<armgcc.linker.libraries.Libraries> <armgcc.linker.libraries.Libraries>
<ListValues> <ListValues>
<Value>arm_cortexM4l_math</Value> <Value>arm_cortexM4l_math</Value>
@ -227,7 +223,7 @@
</armgcc.linker.libraries.LibrarySearchPaths> </armgcc.linker.libraries.LibrarySearchPaths>
<armgcc.linker.optimization.GarbageCollectUnusedSections>True</armgcc.linker.optimization.GarbageCollectUnusedSections> <armgcc.linker.optimization.GarbageCollectUnusedSections>True</armgcc.linker.optimization.GarbageCollectUnusedSections>
<armgcc.linker.miscellaneous.LinkerFlags>-T../src/asf/sam/utils/linker_scripts/sam4l/sam4l4/gcc/flash.ld -Wl,--cref -Wl,--entry=Reset_Handler -mthumb</armgcc.linker.miscellaneous.LinkerFlags> <armgcc.linker.miscellaneous.LinkerFlags>-T../src/asf/sam/utils/linker_scripts/sam4l/sam4l4/gcc/flash.ld -Wl,--cref -Wl,--entry=Reset_Handler -mthumb</armgcc.linker.miscellaneous.LinkerFlags>
<armgcc.assembler.general.AssemblerFlags>-D__ATSAM4LC4C__ -D__ATSAM4LC4C__ -D__ATSAM4LC4C__ -D__ATSAM4LC4C__</armgcc.assembler.general.AssemblerFlags> <armgcc.assembler.general.AssemblerFlags>-D__ATSAM4LC4C__ -D__ATSAM4LC4C__ -D__ATSAM4LC4C__ -D__ATSAM4LC4C__ -D__ATSAM4LC4C__</armgcc.assembler.general.AssemblerFlags>
<armgcc.assembler.general.IncludePaths> <armgcc.assembler.general.IncludePaths>
<ListValues> <ListValues>
<Value>../src/asf/sam/utils/preprocessor</Value> <Value>../src/asf/sam/utils/preprocessor</Value>
@ -256,7 +252,7 @@
<Value>%24(ToolchainDir)\..\..\CMSIS_Atmel\Device\ATMEL\sam4l\include</Value> <Value>%24(ToolchainDir)\..\..\CMSIS_Atmel\Device\ATMEL\sam4l\include</Value>
</ListValues> </ListValues>
</armgcc.assembler.general.IncludePaths> </armgcc.assembler.general.IncludePaths>
<armgcc.preprocessingassembler.general.AssemblerFlags>-DARM_MATH_CM4=true -DBOARD=SAM4L_EK -D__ATSAM4LC4C__ -D__ATSAM4LC4C__ -D__ATSAM4LC4C__ -D__ATSAM4LC4C__ -D__ATSAM4LC4C__</armgcc.preprocessingassembler.general.AssemblerFlags> <armgcc.preprocessingassembler.general.AssemblerFlags>-DARM_MATH_CM4=true -DBOARD=SAM4L_EK -D__ATSAM4LC4C__ -D__ATSAM4LC4C__ -D__ATSAM4LC4C__ -D__ATSAM4LC4C__ -D__ATSAM4LC4C__ -D__ATSAM4LC4C__</armgcc.preprocessingassembler.general.AssemblerFlags>
<armgcc.preprocessingassembler.general.IncludePaths> <armgcc.preprocessingassembler.general.IncludePaths>
<ListValues> <ListValues>
<Value>../src/asf/sam/utils/preprocessor</Value> <Value>../src/asf/sam/utils/preprocessor</Value>
@ -336,7 +332,7 @@
<armgcc.compiler.optimization.PrepareFunctionsForGarbageCollection>True</armgcc.compiler.optimization.PrepareFunctionsForGarbageCollection> <armgcc.compiler.optimization.PrepareFunctionsForGarbageCollection>True</armgcc.compiler.optimization.PrepareFunctionsForGarbageCollection>
<armgcc.compiler.optimization.DebugLevel>Maximum (-g3)</armgcc.compiler.optimization.DebugLevel> <armgcc.compiler.optimization.DebugLevel>Maximum (-g3)</armgcc.compiler.optimization.DebugLevel>
<armgcc.compiler.warnings.AllWarnings>True</armgcc.compiler.warnings.AllWarnings> <armgcc.compiler.warnings.AllWarnings>True</armgcc.compiler.warnings.AllWarnings>
<armgcc.compiler.miscellaneous.OtherFlags>-std=gnu99 -Wmissing-field-initializers -D__ATSAM4LC4C__ -D__ATSAM4LC4C__ -D__ATSAM4LC4C__ -D__ATSAM4LC4C__</armgcc.compiler.miscellaneous.OtherFlags> <armgcc.compiler.miscellaneous.OtherFlags>-std=gnu99 -Wmissing-field-initializers -D__ATSAM4LC4C__ -D__ATSAM4LC4C__ -D__ATSAM4LC4C__ -D__ATSAM4LC4C__ -D__ATSAM4LC4C__</armgcc.compiler.miscellaneous.OtherFlags>
<armgcc.linker.libraries.Libraries> <armgcc.linker.libraries.Libraries>
<ListValues> <ListValues>
<Value>libm</Value> <Value>libm</Value>
@ -350,7 +346,7 @@
</armgcc.linker.libraries.LibrarySearchPaths> </armgcc.linker.libraries.LibrarySearchPaths>
<armgcc.linker.optimization.GarbageCollectUnusedSections>True</armgcc.linker.optimization.GarbageCollectUnusedSections> <armgcc.linker.optimization.GarbageCollectUnusedSections>True</armgcc.linker.optimization.GarbageCollectUnusedSections>
<armgcc.linker.miscellaneous.LinkerFlags>-T../src/asf/sam/utils/linker_scripts/sam4l/sam4l4/gcc/flash.ld -Wl,--cref -Wl,--entry=Reset_Handler -mthumb</armgcc.linker.miscellaneous.LinkerFlags> <armgcc.linker.miscellaneous.LinkerFlags>-T../src/asf/sam/utils/linker_scripts/sam4l/sam4l4/gcc/flash.ld -Wl,--cref -Wl,--entry=Reset_Handler -mthumb</armgcc.linker.miscellaneous.LinkerFlags>
<armgcc.assembler.general.AssemblerFlags>-D__ATSAM4LC4C__ -D__ATSAM4LC4C__ -D__ATSAM4LC4C__ -D__ATSAM4LC4C__</armgcc.assembler.general.AssemblerFlags> <armgcc.assembler.general.AssemblerFlags>-D__ATSAM4LC4C__ -D__ATSAM4LC4C__ -D__ATSAM4LC4C__ -D__ATSAM4LC4C__ -D__ATSAM4LC4C__</armgcc.assembler.general.AssemblerFlags>
<armgcc.assembler.general.IncludePaths> <armgcc.assembler.general.IncludePaths>
<ListValues> <ListValues>
<Value>../src/asf/sam/utils/preprocessor</Value> <Value>../src/asf/sam/utils/preprocessor</Value>
@ -380,7 +376,7 @@
</ListValues> </ListValues>
</armgcc.assembler.general.IncludePaths> </armgcc.assembler.general.IncludePaths>
<armgcc.assembler.debugging.DebugLevel>Default (-g)</armgcc.assembler.debugging.DebugLevel> <armgcc.assembler.debugging.DebugLevel>Default (-g)</armgcc.assembler.debugging.DebugLevel>
<armgcc.preprocessingassembler.general.AssemblerFlags>-DARM_MATH_CM4=true -DBOARD=SAM4L_EK -D__ATSAM4LC4C__ -D__ATSAM4LC4C__ -D__ATSAM4LC4C__ -D__ATSAM4LC4C__ -D__ATSAM4LC4C__</armgcc.preprocessingassembler.general.AssemblerFlags> <armgcc.preprocessingassembler.general.AssemblerFlags>-DARM_MATH_CM4=true -DBOARD=SAM4L_EK -D__ATSAM4LC4C__ -D__ATSAM4LC4C__ -D__ATSAM4LC4C__ -D__ATSAM4LC4C__ -D__ATSAM4LC4C__ -D__ATSAM4LC4C__</armgcc.preprocessingassembler.general.AssemblerFlags>
<armgcc.preprocessingassembler.general.IncludePaths> <armgcc.preprocessingassembler.general.IncludePaths>
<ListValues> <ListValues>
<Value>../src/asf/sam/utils/preprocessor</Value> <Value>../src/asf/sam/utils/preprocessor</Value>

View file

@ -253,7 +253,7 @@ asynchronous timer (AST), as the tick is generated from the low power AST and
not the SysTick as would normally be the case on a Cortex-M. */ not the SysTick as would normally be the case on a Cortex-M. */
void vPortSuppressTicksAndSleep( portTickType xExpectedIdleTime ) void vPortSuppressTicksAndSleep( portTickType xExpectedIdleTime )
{ {
uint32_t ulAlarmValue, ulCompleteTickPeriods; uint32_t ulAlarmValue, ulCompleteTickPeriods, ulInterruptStatus;
eSleepModeStatus eSleepAction; eSleepModeStatus eSleepAction;
portTickType xModifiableIdleTime; portTickType xModifiableIdleTime;
enum sleepmgr_mode xSleepMode; enum sleepmgr_mode xSleepMode;
@ -284,8 +284,7 @@ enum sleepmgr_mode xSleepMode;
/* Enter a critical section but don't use the taskENTER_CRITICAL() method as /* Enter a critical section but don't use the taskENTER_CRITICAL() method as
that will mask interrupts that should exit sleep mode. */ that will mask interrupts that should exit sleep mode. */
__asm volatile( "cpsid i \n\t" ulInterruptStatus = cpu_irq_save();
"dsb \n\t" );
/* The tick flag is set to false before sleeping. If it is true when sleep /* The tick flag is set to false before sleeping. If it is true when sleep
mode is exited then sleep mode was probably exited because the tick was mode is exited then sleep mode was probably exited because the tick was
@ -303,7 +302,7 @@ enum sleepmgr_mode xSleepMode;
/* Re-enable interrupts - see comments above the cpsid instruction() /* Re-enable interrupts - see comments above the cpsid instruction()
above. */ above. */
__asm volatile( "cpsie i" ); cpu_irq_restore( ulInterruptStatus );
} }
else else
{ {
@ -345,7 +344,7 @@ enum sleepmgr_mode xSleepMode;
/* Re-enable interrupts - see comments above the cpsid instruction() /* Re-enable interrupts - see comments above the cpsid instruction()
above. */ above. */
__asm volatile( "cpsie i" ); cpu_irq_restore( ulInterruptStatus );
if( ulTickFlag != pdFALSE ) if( ulTickFlag != pdFALSE )
{ {