Correct UC3 global interrupt functions.
Replace all calls and references to _delay_ms() in the code with the architecture-agnostic Delay_MS() function. Improve code generation for the Delay_MS() function on the AVR8 architecture when called with a constant input.
This commit is contained in:
		
							parent
							
								
									70284d390f
								
							
						
					
					
						commit
						de9bd767dc
					
				
					 9 changed files with 28 additions and 18 deletions
				
			
		| 
						 | 
				
			
			@ -236,18 +236,28 @@
 | 
			
		|||
			/** Function to perform a blocking delay for a specified number of milliseconds. The actual delay will be
 | 
			
		||||
			 *  at a minimum the specified number of milliseconds, however due to loop overhead and internal calculations
 | 
			
		||||
			 *  may be slightly higher.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \param[in] Milliseconds  Number of milliseconds to delay
 | 
			
		||||
			 */
 | 
			
		||||
			static inline void Delay_MS(uint8_t Milliseconds)
 | 
			
		||||
			{
 | 
			
		||||
				#if (ARCH == ARCH_AVR8)
 | 
			
		||||
				if (__builtin_constant_p(Milliseconds))
 | 
			
		||||
				{
 | 
			
		||||
					_delay_ms(Milliseconds);
 | 
			
		||||
				}
 | 
			
		||||
				else
 | 
			
		||||
				{
 | 
			
		||||
					while (Milliseconds--)
 | 
			
		||||
					  _delay_ms(1);
 | 
			
		||||
				}
 | 
			
		||||
				#elif (ARCH == ARCH_UC3)
 | 
			
		||||
				while (Milliseconds--)
 | 
			
		||||
				{
 | 
			
		||||
					#if (ARCH == ARCH_AVR8)
 | 
			
		||||
					_delay_ms(1);
 | 
			
		||||
					#elif (ARCH == ARCH_UC3)
 | 
			
		||||
					__builtin_mtsr(AVR32_COUNT, 0);
 | 
			
		||||
					while (__builtin_mfsr(AVR32_COUNT) < (F_CPU / 1000));				
 | 
			
		||||
					#endif
 | 
			
		||||
				}
 | 
			
		||||
				#endif
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -79,17 +79,17 @@
 | 
			
		|||
 *
 | 
			
		||||
 *      // Turn on each of the four LEDs in turn
 | 
			
		||||
 *      LEDs_SetAllLEDs(LEDS_LED1); 
 | 
			
		||||
 *      _delay_ms(500);
 | 
			
		||||
 *      Delay_MS(500);
 | 
			
		||||
 *      LEDs_SetAllLEDs(LEDS_LED1); 
 | 
			
		||||
 *      _delay_ms(500);
 | 
			
		||||
 *      Delay_MS(500);
 | 
			
		||||
 *      LEDs_SetAllLEDs(LEDS_LED1); 
 | 
			
		||||
 *      _delay_ms(500);
 | 
			
		||||
 *      Delay_MS(500);
 | 
			
		||||
 *      LEDs_SetAllLEDs(LEDS_LED1); 
 | 
			
		||||
 *      _delay_ms(500);
 | 
			
		||||
 *      Delay_MS(500);
 | 
			
		||||
 *
 | 
			
		||||
 *      // Turn on all LEDs
 | 
			
		||||
 *      LEDs_SetAllLEDs(LEDS_ALL_LEDS);
 | 
			
		||||
 *      _delay_ms(1000);
 | 
			
		||||
 *      Delay_MS(1000);
 | 
			
		||||
 *
 | 
			
		||||
 *      // Turn on LED 1, turn off LED 2, leaving LEDs 3 and 4 in their current state
 | 
			
		||||
 *      LEDs_ChangeLEDs((LEDS_LED1 | LEDS_LED2), LEDS_LED1);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -273,7 +273,7 @@ static void USB_Host_ResetDevice(void)
 | 
			
		|||
			break;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		_delay_ms(1);
 | 
			
		||||
		Delay_MS(1);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (HSOFIEnabled)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -273,7 +273,7 @@ static void USB_Host_ResetDevice(void)
 | 
			
		|||
			break;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		_delay_ms(1);
 | 
			
		||||
		Delay_MS(1);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (HSOFIEnabled)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -87,14 +87,15 @@
 | 
			
		|||
			static inline uint_reg_t USB_INT_GetGlobalEnableState(void)
 | 
			
		||||
			{
 | 
			
		||||
				GCC_MEMORY_BARRIER();
 | 
			
		||||
				return (__builtin_mfsr(AVR32_SR) & AVR32_SR_GM);
 | 
			
		||||
				return __builtin_mfsr(AVR32_SR);
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			static inline void USB_INT_SetGlobalEnableState(uint_reg_t GlobalIntState) ATTR_ALWAYS_INLINE;
 | 
			
		||||
			static inline void USB_INT_SetGlobalEnableState(uint_reg_t GlobalIntState)
 | 
			
		||||
			{
 | 
			
		||||
				GCC_MEMORY_BARRIER();
 | 
			
		||||
				__builtin_ssrf(AVR32_SR_GM_OFFSET, GlobalIntState);
 | 
			
		||||
				if (GlobalIntState & AVR32_SR_GM)
 | 
			
		||||
				  __builtin_ssrf(AVR32_SR_GM_OFFSET);
 | 
			
		||||
				GCC_MEMORY_BARRIER();
 | 
			
		||||
			}
 | 
			
		||||
		
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -54,8 +54,7 @@
 | 
			
		|||
 *      cli();
 | 
			
		||||
 *
 | 
			
		||||
 *      // Wait two seconds for the USB detachment to register on the host
 | 
			
		||||
 *      for (uint8_t i = 0; i < 128; i++)
 | 
			
		||||
 *        _delay_ms(16);
 | 
			
		||||
 *      Delay_MS(2000);
 | 
			
		||||
 *
 | 
			
		||||
 *      // Set the bootloader key to the magic value and force a reset
 | 
			
		||||
 *      Boot_Key = MAGIC_BOOT_KEY;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue