#ifndef __CORTEX_M3_H__
#define __CORTEX_M3_H__

#include "commdefs.h"
#include "rtos_target_cfg.h"

class CriticalSection
{
	public:

		CriticalSection() : _statusReg(__get_interrupt_state()) {
			__asm__ __volatile__ ("cpsid i");
		}

		~CriticalSection() {
			__set_interrupt_state(_statusReg);
		}

	private:
		void __set_interrupt_state(uint32_t status) {
			__asm__ __volatile__ (
				"MSR PRIMASK, %0\n"
				: : "r"(status)
				:"memory"
			);
		}

		 uint32_t __get_interrupt_state() {
			uint32_t sr;
			__asm__ __volatile__ ("MRS %0, PRIMASK" : "=r"(sr) );
			return sr;
		}

	private:
		uint32_t	_statusReg;
};

#endif // __CORTEX_M3_H__
