FuSa 8-Bit Libraries Safety Framework
Loading...
Searching...
No Matches
midware_interrupt_manager.c
Go to the documentation of this file.
1
22
23// Framework Includes
24#include <driver_cpuctrl.h>
25#include <driver_cpuint.h>
27
28// Device-specific Includes
29#include <xc.h>
30
31void MW_SetIntVectorLocation(bool expectAltLoc)
32{
33 uint8_t altVectLocMask = (uint8_t)CPUINT_IVSEL_bm;
34 if (expectAltLoc)
35 {
36 CPUINT_SetControlA(altVectLocMask);
37 }
38 else
39 {
40 CPUINT_ClearControlA(altVectLocMask);
41 }
42}
43
44errFlag_t MW_SetIntPriority(bool useRoundRobin, uint8_t altStartVect, uint8_t highPriorityVect)
45{
46 /* Intentional misra-c2012-10.8 deviation */
47 const uint8_t allVectSize = (uint8_t)_VECTORS_SIZE;
48 const uint8_t singleVectSize = (uint8_t)_VECTOR_SIZE;
49 const uint8_t maxVectNumber = (allVectSize / singleVectSize) - 1U;
50
51 // Assumes a continuous list of valid vector numbers up until the maximum
52 bool invalidAltStartVect = (altStartVect > maxVectNumber);
53 bool invalidHighPriorityVect = (highPriorityVect > maxVectNumber);
54 bool isVectorsInvalid = (invalidAltStartVect || invalidHighPriorityVect);
55
56 if (isVectorsInvalid)
57 {
58 /* cppcheck-suppress misra-c2012-15.5 */
59 return ERROR;
60 }
61
62 uint8_t roundRobinMask = (uint8_t)CPUINT_LVL0RR_bm;
63 if (useRoundRobin)
64 {
65 CPUINT_SetControlA(roundRobinMask);
66 }
67 else
68 {
69 CPUINT_ClearControlA(roundRobinMask);
70 }
71
72 CPUINT_WriteIntPriority0(altStartVect);
73
74 CPUINT_WriteIntPriority1(highPriorityVect);
75
76 return NO_ERROR;
77}
78
80{
81 const uint8_t gieBitmask = (uint8_t)CPU_I_bm; // Global Interrupt Enable status bit
82 CPUCTRL_SetStatusRegister(gieBitmask);
83
84 uint8_t regVal = CPUCTRL_ReadStatusRegister();
85 bool writeFailed = ((regVal & gieBitmask) != gieBitmask);
86
87 errFlag_t flag = NO_ERROR;
88 if (writeFailed)
89 {
90 flag = ERROR;
91 }
92 return flag;
93}
94
96{
97 CPUCTRL_ClearStatusRegister((uint8_t)CPU_I_bm);
98}
errFlag_t
Defines the error flag used by Middleware services to indicate error detection.
@ NO_ERROR
uint8_t CPUCTRL_ReadStatusRegister(void)
Reads the SREG register value.
void CPUCTRL_ClearStatusRegister(uint8_t bitmask)
Clears specific bits in the SREG register.
void CPUCTRL_SetStatusRegister(uint8_t bitmask)
Sets specific bits in the SREG register.
void CPUINT_ClearControlA(uint8_t bitmask)
Clears specific bits in the CTRLA register.
void CPUINT_SetControlA(uint8_t bitmask)
Sets specific bits in the CTRLA register.
void CPUINT_WriteIntPriority0(uint8_t value)
Overwrites the LVL0PRI register value.
void CPUINT_WriteIntPriority1(uint8_t value)
Overwrites the LVL1VEC register value.
errFlag_t MW_EnableGlobalInterrupts(void)
Enables global interrupts on the device.
void MW_DisableGlobalInterrupts(void)
Disables global interrupts on the device.
errFlag_t MW_SetIntPriority(bool useRoundRobin, uint8_t altStartVect, uint8_t highPriorityVect)
Configures interrupt scheduling and priority scheme.
void MW_SetIntVectorLocation(bool expectAltLoc)
Configures whether the device should expect an alternative interrupt vector table location (see IVSEL...