Choco OS  V.0.16.9.0
Join to the chocolate world
oc_mcs.c
1 
27 #include <oc_mcs.h>
28 #include <oc_lsf.h>
29 #include <oc_interrupts.h>
30 #include <oc_array.h>
31 #include <oc_bits.h>
32 
38 #define _________________________________________MACROS_SECTION_____________________________________________________________________________
39 
40 #define IsRam(Address) (oC_LSF_IsRamAddress(Address) || oC_LSF_IsExternalAddress(Address))
41 #define IsRom(Address) oC_LSF_IsRomAddress(Address)
42 #define IsCorrect(Address) oC_LSF_IsCorrectAddress(Address)
43 #define ALIGN_ADDRESS(Address,Alignment) ((void*)((((oC_UInt_t)Address) + Alignment - 1) & ~(Alignment-1)))
44 #define IsAligned(Address,Alignment) ( ALIGN_ADDRESS(Address,Alignment) == Address )
45 
46 
47 #undef _________________________________________MACROS_SECTION_____________________________________________________________________________
48 
49 
55 #define _________________________________________TYPES_SECTION______________________________________________________________________________
56 
57 //==========================================================================================================================================
64 //==========================================================================================================================================
65 typedef volatile struct
66 {
67  /* Software Registers - registers switched by the software*/
68  oC_UInt_t R4;
69  oC_UInt_t R5;
70  oC_UInt_t R6;
71  oC_UInt_t R7;
72  oC_UInt_t R8;
73  oC_UInt_t R9;
74  oC_UInt_t R10;
75  oC_UInt_t R11;
76  /* Hardware Registers - registers switched by the hardware */
77  oC_UInt_t R0;
78  oC_UInt_t R1;
79  oC_UInt_t R2;
80  oC_UInt_t R3;
81  oC_UInt_t R12;
82  oC_UInt_t LR;
83  oC_UInt_t PC;
84  oC_UInt_t xPSR;
85 } Context_t;
86 
87 //==========================================================================================================================================
88 //==========================================================================================================================================
89 typedef struct
90 {
91  oC_Access_t User;
92  oC_Access_t Privileged;
94 
95 #undef _________________________________________TYPES_SECTION______________________________________________________________________________
96 
102 #define _________________________________________LOCAL_VARIABLES_SECTION____________________________________________________________________
103 
104 //==========================================================================================================================================
108 //==========================================================================================================================================
109 static oC_Stack_t CurrentStack = NULL;
110 //==========================================================================================================================================
114 //==========================================================================================================================================
115 static oC_Stack_t NextStack = NULL;
116 
117 //==========================================================================================================================================
121 //==========================================================================================================================================
122 static oC_Stack_t SystemStack = NULL;
123 //==========================================================================================================================================
127 //==========================================================================================================================================
128 static oC_FindNextStackHandler_t GlobalFindNextStackHandler = NULL;
129 //==========================================================================================================================================
133 //==========================================================================================================================================
135 
136 //==========================================================================================================================================
140 //==========================================================================================================================================
141 static const oC_MemorySize_t PossibleMemoryRegionSizes[] = {
142  B(0) ,
143  B(0) ,
144  B(0) ,
145  B(0) ,
146  B(32) ,
147  B(64) ,
148  B(128) ,
149  B(256) ,
150  B(512) ,
151  kB(1) ,
152  kB(2) ,
153  kB(4) ,
154  kB(8) ,
155  kB(16) ,
156  kB(32) ,
157  kB(64) ,
158  kB(128) ,
159  kB(256) ,
160  kB(512) ,
161  MB(1) ,
162  MB(2) ,
163  MB(4) ,
164  MB(8) ,
165  MB(16) ,
166  MB(32) ,
167  MB(64) ,
168  MB(128) ,
169  MB(256) ,
170  MB(512) ,
171  GB(1) ,
172 };
173 
174 //==========================================================================================================================================
180 //==========================================================================================================================================
181 static const AccessPermissions_t PossibleAccessPermissions[] = {
182  { .User = oC_Access_None , .Privileged = oC_Access_None } ,
183  { .User = oC_Access_None , .Privileged = oC_Access_RW } ,
184  { .User = oC_Access_R , .Privileged = oC_Access_RW } ,
185  { .User = oC_Access_RW , .Privileged = oC_Access_RW } ,
186  { .User = oC_Access_None , .Privileged = oC_Access_None } ,
187  { .User = oC_Access_None , .Privileged = oC_Access_R } ,
188  { .User = oC_Access_R , .Privileged = oC_Access_R } ,
189  { .User = oC_Access_R , .Privileged = oC_Access_R } ,
190 };
191 
192 #undef _________________________________________LOCAL_VARIABLES_SECTION____________________________________________________________________
193 
199 #define _________________________________________LOCAL_PROTOTYPES_SECTION___________________________________________________________________
200 
201 static inline void TriggerPendSV ( void );
202 static bool IsStackCorrect ( oC_Stack_t Stack );
203 static oC_MemorySize_t FindMemoryRegionSize ( oC_MemorySize_t Size , bool AlignSize , uint8_t * outSizeId );
204 static uint8_t FindAccessPermissions ( oC_Access_t User , oC_Access_t Privileged );
205 static void SetPowerForMpu ( oC_Power_t Power );
206 static oC_Power_t GetPowerOfMpu ( void );
207 
208 #undef _________________________________________LOCAL_PROTOTYPES_SECTION___________________________________________________________________
209 
210 
216 #define _________________________________________INTERRUPTS_HANDLERS_SECTION________________________________________________________________
217 
218 //==========================================================================================================================================
222 //==========================================================================================================================================
223 oC_InterruptHandler(System,SysTick)
224 {
225  /* When this assertion fails, it means, that module was not initialized yet */
226  oC_ASSERT(CurrentStack != NULL);
227 
228  /* Searching next stack if required and possible */
229  if(GlobalFindNextStackHandler != NULL)
230  {
231  GlobalFindNextStackHandler();
232  }
233 
234  /* When this assertion fails, it means, that the stack is overflowed */
235  oC_ASSERT(CurrentStack->StackPointer >= CurrentStack->Buffer);
236 
237  /* If next stack is set */
238  if(NextStack != NULL)
239  {
240  TriggerPendSV();
241  }
242 }
243 
244 //==========================================================================================================================================
248 //==========================================================================================================================================
249 __attribute__((naked)) oC_InterruptHandler(System,PendSV)
250 {
251  oC_UInt_t r;
252 
253  __asm volatile (
254  "MOV r12, %1 \n\t" /* Move the pointer to the r12, because it will be overwritten */
255  "MRS r1, psp \n\t" /* Move Process stack pointer (PSP) to the first available register (r12) */
256  "STMDB r1!, {r4-r11} \n\t" /* Store software registers (registers, that are not switched by hardware) */
257  "STR r1, [r12, #0] \n\t" /* Save the stack pointer to the memory */
258  : "=r" (r)
259  : "r" (&CurrentStack->StackPointer)
260  );
261 
262  __asm volatile (
263  "MOV r12, %1 \n\t"
264  "LDR r1, [%1, #0] \n\t"
265  "LDMFD r1!, {r4-r11} \n\t" /* Load software registers (registers, that are not switched by hardware) */
266  "MSR psp, r1 \n\t" /* Update PSP to new stack pointer */
267  "STR r1, [r12, #0] \n\t"
268  : "=r" (r)
269  : "r" (&NextStack->StackPointer)
270  );
271 
272  CurrentStack = NextStack;
273  NextStack = NULL;
274  __asm volatile (
275  "bx lr \n\t" /* This is a naked function, so it must be branched manually */
276  );
277 }
278 
279 #undef _________________________________________INTERRUPTS_HANDLERS_SECTION________________________________________________________________
280 
286 #define _________________________________________INTERFACE_FUNCTIONS_SECTION________________________________________________________________
287 
288 /* This defines number of bits needed for priority storing. It is needed for CMSIS */
289 #define __NVIC_PRIO_BITS oC_MACHINE_PRIO_BITS
290 #define __MPU_PRESENT 1
291 
292 #include <core_cm4.h>
293 
294 //==========================================================================================================================================
298 //==========================================================================================================================================
300 {
301  /* This assertion fails, when process stack size is configured too small in linker configuration file */
303 
304  /* Initialization of the system stack */
305  SystemStack = oC_LSF_GetProcessStackStart();
306  SystemStack->Buffer = oC_LSF_GetProcessStackStart() + oC_MCS_AlignSize(sizeof(oC_StackData_t), oC_MCS_MEMORY_ALIGNMENT);
307  SystemStack->BufferSize = oC_LSF_GetProcessStackSize() - oC_MCS_AlignSize(sizeof(oC_StackData_t), oC_MCS_MEMORY_ALIGNMENT);
309 
310  /* At the start current stack is the system stack */
311  CurrentStack = SystemStack;
312 
313  return true;
314 }
315 
316 //==========================================================================================================================================
320 //==========================================================================================================================================
322 {
323  return (void*)SCB->BFAR;
324 }
325 
326 //==========================================================================================================================================
330 //==========================================================================================================================================
332 {
333  __set_BASEPRI(0);
334  __asm("cpsie i");
335  __asm volatile( "dsb" );
336  __asm volatile( "isb" );
337 }
338 
339 //==========================================================================================================================================
344 //==========================================================================================================================================
345 
347 {
348  __set_BASEPRI(0xFF);
349 }
350 
351 //==========================================================================================================================================
355 //==========================================================================================================================================
357 {
358  uint32_t basepri = __get_BASEPRI();
359 
360  return basepri == 0;
361 }
362 
363 //==========================================================================================================================================
367 //==========================================================================================================================================
368 bool oC_MCS_EnableInterrupt( IRQn_Type InterruptNumber )
369 {
370  NVIC_EnableIRQ(InterruptNumber);
371  return true;
372 }
373 
374 //==========================================================================================================================================
378 //==========================================================================================================================================
379 bool oC_MCS_DisableInterrupt( IRQn_Type InterruptNumber )
380 {
381  NVIC_DisableIRQ(InterruptNumber);
382  return true;
383 }
384 
385 //==========================================================================================================================================
389 //==========================================================================================================================================
390 bool oC_MCS_IsInterruptEnabled( IRQn_Type InterruptNumber )
391 {
392  return (NVIC->ISER[(uint32_t)((int32_t)InterruptNumber) >> 5] & (uint32_t)(1 << ((uint32_t)((int32_t)InterruptNumber) & (uint32_t)0x1F))) != 0;
393 }
394 
395 //==========================================================================================================================================
399 //==========================================================================================================================================
401 {
402  NVIC_SetPriority(InterruptNumber , Priority);
403  return true;
404 }
405 
406 //==========================================================================================================================================
410 //==========================================================================================================================================
412 {
413  return NVIC_GetPriority(InterruptNumber);
414 }
415 
416 //==========================================================================================================================================
420 //==========================================================================================================================================
421 void oC_MCS_Reboot( void )
422 {
423  NVIC_SystemReset();
424  while(1);
425 }
426 
427 //==========================================================================================================================================
431 //==========================================================================================================================================
433  oC_Stack_t * outStack ,
434  void * Buffer ,
435  oC_Int_t BufferSize ,
436  oC_ContextHandler_t ContextHandler ,
437  void * HandlerParameter ,
438  oC_ContextExitHandler_t ExitHandler
439  )
440 {
441  bool success = false;
442 
443  if(
444  BufferSize > oC_MCS_GetMinimumStackBufferSize(0) &&
445  IsRam(Buffer) &&
446  IsRam(outStack) &&
447  oC_LSF_IsCorrectAddress(ContextHandler) &&
448  oC_LSF_IsCorrectAddress(ExitHandler)
449  )
450  {
451  /* ============================================
452  *
453  * --------------- [ Buffer ] -----------------
454  *
455  * This part of buffer is free stack
456  *
457  * --------------- [context] ------------------
458  *
459  * This part of buffer is initialized at the
460  * start as machine context
461  *
462  * ---------------- [stack] -------------------
463  * This part of buffer is for storing stack
464  * data
465  * -------------- [ bufferEnd ] ---------------
466  *
467  * ============================================ */
468  void * bufferEnd = &(((uint8_t*)Buffer)[BufferSize]);
469  oC_Stack_t stack = oC_MCS_AlignStackPointer(bufferEnd - sizeof(oC_StackData_t) - sizeof(uint32_t));
470  Context_t * context = oC_MCS_AlignStackPointer(stack - sizeof(Context_t));
471 
472  if((((void*)stack) > Buffer) && (((void*)context) > Buffer))
473  {
474  /* Initializing registers of machine (in first start of this, it will be read by the hardware) */
475  context->PC = (oC_UInt_t)ContextHandler; /* Program Counter set to the context handler function */
476  context->xPSR = oC_MCS_xPSR_INITIAL_VALUE; /* Initial value for the xPSR */
477  context->LR = (oC_UInt_t)ExitHandler; /* Link Register (address of return) */
478  context->R0 = (oC_UInt_t)HandlerParameter; /* Parameters pointer will be given to the r0 register */
479  context->R1 = 0;
480  context->R2 = 0;
481  context->R3 = 0;
482  context->R4 = 0;
483  context->R5 = 0;
484  context->R6 = 0;
485  context->R7 = 0;
486  context->R8 = 0;
487  context->R9 = 0;
488  context->R10 = 0;
489  context->R11 = 0;
490  context->R12 = 0;
491 
492  stack->StackPointer = (void*)context;
493  stack->Buffer = Buffer;
494  stack->BufferSize = BufferSize;
495 
496  *outStack = stack;
497  success = true;
498 
499  }
500  }
501 
502  return success;
503 }
504 
505 //==========================================================================================================================================
509 //==========================================================================================================================================
511 {
512  return (void*) __get_PSP();
513 }
514 
515 //==========================================================================================================================================
519 //==========================================================================================================================================
521 {
522  return (void*) __get_MSP();
523 }
524 //==========================================================================================================================================
528 //==========================================================================================================================================
530 {
531  oC_Int_t stackSize = 0;
532 
533  if(Stack == NULL)
534  {
535  Stack = CurrentStack;
536  }
537 
538  if(IsStackCorrect(Stack))
539  {
540  stackSize = Stack->BufferSize;
541  }
542 
543  return stackSize;
544 }
545 
546 //==========================================================================================================================================
550 //==========================================================================================================================================
552 {
553  oC_Int_t freeStackSize = 0;
554 
555  if(Stack == NULL)
556  {
557  Stack = CurrentStack;
558  }
559 
560  if(IsRam(Stack))
561  {
562  void * currentStackPointer = NULL;
563 
564  if(CurrentStack == Stack)
565  {
566  currentStackPointer = oC_MCS_GetCurrentProcessStackPointer();
567  }
568  else
569  {
570  currentStackPointer = Stack->StackPointer;
571  }
572 
573  if(currentStackPointer >= ((void*)Stack->Buffer))
574  {
575  freeStackSize = (oC_Int_t)(currentStackPointer - ((void*)Stack->Buffer));
576  }
577  else
578  {
579  freeStackSize -= (oC_Int_t)(((void*)Stack->Buffer) - currentStackPointer);
580  }
581  }
582 
583  return freeStackSize;
584 }
585 
586 //==========================================================================================================================================
590 //==========================================================================================================================================
592 {
593  return CurrentStack;
594 }
595 
596 //==========================================================================================================================================
600 //==========================================================================================================================================
601 oC_Int_t oC_MCS_GetMinimumStackBufferSize( oC_Int_t StackSize )
602 {
603  return oC_MCS_AlignSize(sizeof(Context_t), oC_MCS_STACK_MEMORY_ALIGNMENT) +
604  oC_MCS_AlignSize(sizeof(oC_StackData_t), oC_MCS_MEMORY_ALIGNMENT) +
605  oC_MCS_AlignSize(StackSize , oC_MCS_STACK_MEMORY_ALIGNMENT);
606 }
607 
608 //==========================================================================================================================================
612 //==========================================================================================================================================
614 {
615  bool stackSwitched = false;
616 
617  if(IsStackCorrect(Stack))
618  {
620  NextStack = Stack;
622 
623  stackSwitched = true;
624  }
625 
626  return stackSwitched;
627 }
628 
629 //==========================================================================================================================================
633 //==========================================================================================================================================
634 bool oC_MCS_ConfigureSystemTimer( oC_UInt_t Prescaler , oC_FindNextStackHandler_t FindNextStackHandler )
635 {
636  bool configured = false;
637 
638  if(Prescaler > 0 && oC_LSF_IsCorrectAddress(FindNextStackHandler))
639  {
640  if(SysTick_Config(Prescaler) == 0)
641  {
642  NVIC_SetPriority( PendSV_IRQn , oC_InterruptPriority_Minimum - 1);
643  NVIC_SetPriority( SysTick_IRQn , oC_InterruptPriority_Maximum + 1);
644 
645  GlobalFindNextStackHandler = FindNextStackHandler;
646 
647  configured = true;
648  }
649  }
650 
651  return configured;
652 }
653 
654 //==========================================================================================================================================
658 //==========================================================================================================================================
660 {
661  return SystemStack;
662 }
663 
664 //==========================================================================================================================================
668 //==========================================================================================================================================
670 {
671  return oC_MCS_SetNextStack(SystemStack);
672 }
673 
674 //==========================================================================================================================================
678 //==========================================================================================================================================
679 void oC_MCS_Delay( register oC_UInt_t Cycles )
680 {
681  Cycles /= 3; // 3 clock cycles per loop
682  if(Cycles>0)
683  {
684  __asm volatile(
685  "mov r3, %[Cycles] \n\t"
686  "loop: \n\t"
687  "subs r3, #1 \n\t"
688  "bne loop \n\t"
689  :
690  : [Cycles] "r" (Cycles)
691  );
692  }
693 }
694 
695 
696 //==========================================================================================================================================
700 //==========================================================================================================================================
702 {
703  oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
704 
705  if(
706  ErrorCondition(IsCorrect(Config) , oC_ErrorCode_WrongAddress )
707  && ErrorCondition(IsCorrect(Config->BaseAddress) , oC_ErrorCode_WrongAddress )
708  && ErrorCondition(Config->Size > 0 , oC_ErrorCode_SizeNotCorrect )
709  && ErrorCondition(Config->RegionNumber < oC_MCS_GetMaximumNumberOfRegions() , oC_ErrorCode_RegionNumberNotCorrect )
710  )
711  {
712  oC_MemorySize_t foundRegionSize = 0;
713  uint8_t accessPermissions = 0;
714  uint8_t disableExecution = oC_Bits_AreBitsSetU32(Config->UserAccess | Config->PrivilegedAccess , oC_Access_Execute) ? 0 : 1;
715  uint8_t sizeId = 0;
716 
717  oC_Procedure_Begin
718  {
719  foundRegionSize = FindMemoryRegionSize(Config->Size,Config->AlignSize,&sizeId);
720  accessPermissions = FindAccessPermissions(Config->UserAccess,Config->PrivilegedAccess);
721 
722  oC_Procedure_ExitIfFalse( foundRegionSize >= Config->Size , oC_ErrorCode_SizeNotCorrect);
723  oC_Procedure_ExitIfFalse( accessPermissions < 0xFF , oC_ErrorCode_AccessPermissionsNotPossible);
724  oC_Procedure_ExitIfFalse( IsAligned(Config->BaseAddress,foundRegionSize) , oC_ErrorCode_AddressNotAligned);
725  oC_Procedure_ExitIfFalse(
728  oC_ErrorCode_AccessPermissionsNotCorrect);
729  oC_Procedure_ExitIfFalse(
732  oC_ErrorCode_AccessPermissionsNotCorrect);
733 
734  SetPowerForMpu(oC_Power_Off);
735  MPU->RNR = Config->RegionNumber;
736  MPU->RBAR = (uint32_t)Config->BaseAddress;
737  MPU->RASR = ((uint32_t)disableExecution << MPU_RASR_XN_Pos) |
738  ((uint32_t)accessPermissions << MPU_RASR_AP_Pos) |
739  ((uint32_t)0x00 << MPU_RASR_TEX_Pos) |
740  (((uint32_t)Config->Shareable ? 1 : 0) << MPU_RASR_S_Pos) |
741  (((uint32_t)Config->Cacheable ? 1 : 0) << MPU_RASR_C_Pos) |
742  (((uint32_t)Config->Bufforable ? 1 : 0) << MPU_RASR_B_Pos) |
743  ((uint32_t)0x00 << MPU_RASR_SRD_Pos) |
744  ((uint32_t)sizeId << MPU_RASR_SIZE_Pos) |
745  ((uint32_t)Config->Power == oC_Power_On ? 1 : 0 << MPU_RASR_ENABLE_Pos);
746 
747  SetPowerForMpu(oC_Power_On);
748 
749  errorCode = oC_ErrorCode_None;
750  }
751  oC_Procedure_End;
752 
753  }
754 
755  return errorCode;
756 }
757 
758 //==========================================================================================================================================
762 //==========================================================================================================================================
764 {
765  return (MPU->TYPE & MPU_TYPE_DREGION_Msk) >> MPU_TYPE_DREGION_Pos;
766 }
767 
768 //==========================================================================================================================================
772 //==========================================================================================================================================
774 {
775  uint32_t numberOfRegions = 0;
776  uint32_t maxNumberOfRegions = oC_MCS_GetMaximumNumberOfRegions();
777  oC_Power_t savedPowerState = oC_Power_Off;
778 
780 
781  savedPowerState = GetPowerOfMpu();
782 
783  SetPowerForMpu(oC_Power_Off);
784 
785  for(uint32_t i = 0 ; i < maxNumberOfRegions ; i++)
786  {
787  MPU->RNR = i;
788 
789  if(oC_Bits_AreBitsSetU32(MPU->RASR, MPU_RASR_ENABLE_Msk))
790  {
791  numberOfRegions++;
792  }
793  }
794 
795  SetPowerForMpu(savedPowerState);
796 
798 
799  return numberOfRegions;
800 }
801 
802 //==========================================================================================================================================
806 //==========================================================================================================================================
807 bool oC_MCS_ReadFreeRegionNumber( uint32_t * outFreeRegionNumber )
808 {
809  bool found = false;
810 
811  if(IsRam(outFreeRegionNumber))
812  {
813  uint32_t maxNumberOfRegions = oC_MCS_GetMaximumNumberOfRegions();
814  oC_Power_t savedPowerState = oC_Power_Off;
815 
817 
818  savedPowerState = GetPowerOfMpu();
819 
820  SetPowerForMpu(oC_Power_Off);
821 
822  for(uint32_t i = 0 ; i < maxNumberOfRegions ; i++)
823  {
824  MPU->RNR = i;
825 
826  if(oC_Bits_AreBitsClearU32(MPU->RASR, MPU_RASR_ENABLE_Msk))
827  {
828  *outFreeRegionNumber = i;
829  found = true;
830  break;
831  }
832  }
833 
834  SetPowerForMpu(savedPowerState);
835 
837  }
838 
839  return found;
840 }
841 
842 //==========================================================================================================================================
846 //==========================================================================================================================================
848 {
849  bool success = false;
850 
852  {
853  MPU->CTRL |= MPU_CTRL_PRIVDEFENA_Msk;
854  success = true;
855  }
856  else if(Mode == oC_MCS_MemoryAccessMode_User)
857  {
858  MPU->CTRL &= ~MPU_CTRL_PRIVDEFENA_Msk;
859  success = true;
860  }
861 
862  return success;
863 }
864 
865 //==========================================================================================================================================
869 //==========================================================================================================================================
871 {
872  return (MPU->CTRL & MPU_CTRL_PRIVDEFENA_Msk) != 0 ? oC_MCS_MemoryAccessMode_Privileged : oC_MCS_MemoryAccessMode_User;
873 }
874 
875 #undef _________________________________________INTERFACE_FUNCTIONS_SECTION________________________________________________________________
876 
882 #define _________________________________________LOCAL_FUNCTIONS_SECTION____________________________________________________________________
883 
884 //==========================================================================================================================================
888 //==========================================================================================================================================
889 static inline void TriggerPendSV(void)
890 {
891  SCB->ICSR |= SCB_ICSR_PENDSVSET_Msk;
892 }
893 
894 //==========================================================================================================================================
898 //==========================================================================================================================================
899 static bool IsStackCorrect( oC_Stack_t Stack )
900 {
901  return IsRam(Stack) &&
903  (Stack->StackPointer < (Stack->Buffer + Stack->BufferSize)) &&
904  (Stack->StackPointer >= (Stack->Buffer));
905 }
906 
907 //==========================================================================================================================================
919 //==========================================================================================================================================
920 static oC_MemorySize_t FindMemoryRegionSize( oC_MemorySize_t Size , bool AlignSize , uint8_t * outSizeId )
921 {
922  oC_MemorySize_t foundSize = 0;
923  uint8_t sizeId = 0;
924 
925  /* Searching for the size */
926  oC_ARRAY_FOREACH_IN_ARRAY(PossibleMemoryRegionSizes,regionSize)
927  {
928  if((*regionSize) > 0)
929  {
930  if((*regionSize) == Size)
931  {
932  foundSize = *regionSize;
933  break;
934  }
935  else if(AlignSize)
936  {
937  foundSize = *regionSize;
938 
939  if(foundSize > Size)
940  {
941  break;
942  }
943  }
944  }
945  sizeId++;
946  }
947 
948  if(foundSize > 0)
949  {
950  *outSizeId = sizeId;
951  }
952 
953  return foundSize;
954 }
955 
956 //==========================================================================================================================================
962 //==========================================================================================================================================
963 static uint8_t FindAccessPermissions( oC_Access_t User , oC_Access_t Privileged )
964 {
965  uint8_t foundAccessPermissions = 0xFF;
966  uint8_t arraySize = oC_ARRAY_SIZE(PossibleAccessPermissions);
967 
968  /* Only RW flags are stored in the array */
969  User &= oC_Access_RW;
970  Privileged &= oC_Access_RW;
971 
972  for(uint8_t i = 0; i < arraySize ; i++)
973  {
974  if(User == PossibleAccessPermissions[i].User && Privileged == PossibleAccessPermissions[i].Privileged)
975  {
976  foundAccessPermissions = i;
977  }
978  }
979 
980  return foundAccessPermissions;
981 }
982 
983 //==========================================================================================================================================
987 //==========================================================================================================================================
988 static void SetPowerForMpu( oC_Power_t Power )
989 {
990  if(Power == oC_Power_On)
991  {
992  /* Enable the MPU */
993  MPU->CTRL |= MPU_CTRL_ENABLE_Msk;
994 
995  /* Enable fault exceptions */
996  SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk;
997  }
998  else
999  {
1000  /* Disable fault exceptions */
1001  SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk;
1002 
1003  /* Disable the MPU */
1004  MPU->CTRL &= ~MPU_CTRL_ENABLE_Msk;
1005  }
1006 }
1007 
1008 //==========================================================================================================================================
1012 //==========================================================================================================================================
1013 static oC_Power_t GetPowerOfMpu( void )
1014 {
1015  return oC_Bits_AreBitsSetU32(MPU->CTRL , MPU_CTRL_ENABLE_Msk) ? oC_Power_On : oC_Power_Off;
1016 }
1017 
1018 #undef _________________________________________LOCAL_FUNCTIONS_SECTION____________________________________________________________________
#define oC_InterruptHandler(BASE_NAME, TYPE_NAME)
Define handler for interrupt.
stores stack data
Definition: oc_mcs.h:208
Something is powered on.
Definition: oc_stdtypes.h:252
If this flag is set it does mean, that this resource is executable.
Definition: oc_memory.h:94
oC_Int_t oC_MCS_GetMinimumStackBufferSize(oC_Int_t StackSize)
returns minimum stack buffer size
Definition: oc_mcs.c:601
void * oC_MCS_GetCurrentProcessStackPointer(void)
returns current value of PSP
Definition: oc_mcs.c:510
static bool oC_Bits_AreBitsSetU32(uint32_t BitMask, uint32_t BitsToCheck)
checks if all bits in field are set
Definition: oc_bits.h:884
#define oC_MCS_AlignStackPointer(Pointer)
align pointer to the stack alignment
Definition: oc_mcs.h:89
#define oC_ARRAY_SIZE(ARRAY)
returns size of static array
Definition: oc_array.h:36
#define oC_MCS_IsStackPointerAligned(Pointer)
checks if stack pointer is aligned to the machine stack memory alignment
Definition: oc_mcs.h:119
bool Cacheable
True if the region should be cacheable - If you set a region to be cacheable: When you load from that...
Definition: oc_mcs.h:231
#define GB(GBytes)
Number of GB.
Definition: oc_cfg.h:88
void * Buffer
Definition: oc_mcs.h:211
oC_MemorySize_t Size
Size of the region.
Definition: oc_mcs.h:225
None access is allowed.
Definition: oc_memory.h:91
bool oC_MCS_SetMemoryAccessMode(oC_MCS_MemoryAccessMode_t Mode)
sets the memory access mode
Definition: oc_mcs.c:847
void(* oC_FindNextStackHandler_t)(void)
stores pointer to function for searching next stack
Definition: oc_mcs.h:265
Memory controller is configured to allow for memory access only for regions that can be accessible by...
Definition: oc_mcs.h:245
void * oC_MCS_GetHardFaultReason(void)
returns address that cause a hard fault
Definition: oc_mcs.c:321
int16_t oC_MCS_CriticalSectionCounter
global variable with critical section nesting counter
Definition: oc_mcs.c:134
oC_Stack_t oC_MCS_GetSystemStack(void)
returns pointer to the system stack
Definition: oc_mcs.c:659
bool oC_MCS_SetInterruptPriority(IRQn_Type InterruptNumber, oC_InterruptPriotity_t Priority)
sets interrupt priority
Definition: oc_mcs.c:400
The file with interface for LSF module.
bool oC_MCS_ReturnToSystemStack(void)
sets next stack as system stack
Definition: oc_mcs.c:669
void oC_MCS_Reboot(void)
Software reboots of machine.
Definition: oc_mcs.c:421
oC_InterruptPriotity_t
stores priority of interrupts
Definition: oc_mcs.h:174
#define B(Bytes)
Number of bytes.
Definition: oc_cfg.h:73
void * oC_MCS_GetCurrentMainStackPointer(void)
returns current value of MSP
Definition: oc_mcs.c:520
void * StackPointer
Definition: oc_mcs.h:210
const void * BaseAddress
Base address of the region - this must point to the start of the region.
Definition: oc_mcs.h:224
bool oC_MCS_InitializeStack(oC_Stack_t *outStack, void *Buffer, oC_Int_t BufferSize, oC_ContextHandler_t ContextHandler, void *HandlerParameter, oC_ContextExitHandler_t ExitHandler)
initializes stack for the system
Definition: oc_mcs.c:432
bool oC_MCS_EnableInterrupt(IRQn_Type InterruptNumber)
enables interrupt with specified number
Definition: oc_mcs.c:368
void(* oC_ContextHandler_t)(void *ContextParameter)
stores handler of function, that handles context
Definition: oc_mcs.h:190
uint32_t RegionNumber
Number of the region to configure.
Definition: oc_mcs.h:233
oC_ErrorCode_t oC_MCS_ConfigureMemoryRegion(const oC_MCS_MemoryRegionConfig_t *Config)
configures memory region
Definition: oc_mcs.c:701
oC_Int_t oC_MCS_GetFreeStackSize(oC_Stack_t Stack)
returns number of free stack
Definition: oc_mcs.c:551
bool oC_MCS_SetNextStack(oC_Stack_t Stack)
sets next stack for context switching
Definition: oc_mcs.c:613
void oC_MCS_Delay(register oC_UInt_t Cycles)
delays operations for cycles
Definition: oc_mcs.c:679
void(* oC_ContextExitHandler_t)(void)
stores handler of function called, when context handling is finished
Definition: oc_mcs.h:199
bool Bufforable
True if the region should be bufforable - Bufferable means whether a write to the address can be buff...
Definition: oc_mcs.h:232
Something is powered off.
Definition: oc_stdtypes.h:251
#define oC_MCS_AlignSize(Size, Alignment)
align size to the machine alignment
Definition: oc_mcs.h:111
bool oC_MCS_IsInterruptEnabled(IRQn_Type InterruptNumber)
checks if interrupt is enabled
Definition: oc_mcs.c:390
oC_Access_t UserAccess
Definition of access for user space.
Definition: oc_mcs.h:228
oC_Access_t
Type for storing access (R/W/RW)
Definition: oc_memory.h:89
bool oC_MCS_ConfigureSystemTimer(oC_UInt_t Prescaler, oC_FindNextStackHandler_t FindNextStackHandler)
configures system timer
Definition: oc_mcs.c:634
bool oC_MCS_AreInterruptsEnabled(void)
Checks if interrupts are enabled in HW.
Definition: oc_mcs.c:356
static bool oC_Bits_AreBitsClearU32(uint32_t BitMask, uint32_t BitsToCheck)
checks if all bits in field are clear
Definition: oc_bits.h:952
oC_Int_t oC_MCS_GetStackSize(oC_Stack_t Stack)
returns size of stack
Definition: oc_mcs.c:529
Memory controller is configured to allow for memory access for regions that can be accessible by a pr...
Definition: oc_mcs.h:246
Contains machine core specific functions.
The file with functions for the bits operation.
uint32_t oC_MCS_GetNumberOfRegions(void)
returns number of regions that are currently configured
Definition: oc_mcs.c:773
bool oC_MCS_InitializeModule(void)
initializes module to work
Definition: oc_mcs.c:299
IRQn_Type
type for the CMSIS library, that contains definitions of interrupts
Definition: oc_mcs.h:149
stores ETH context
Definition: oc_eth.c:97
static void oC_MCS_EnterCriticalSection(void)
Enters to critical section.
Definition: oc_mcs.h:755
Static array definitions.
oC_MCS_MemoryAccessMode_t
stores memory access mode
Definition: oc_mcs.h:243
oC_Stack_t oC_MCS_GetCurrentStack(void)
returns current stack
Definition: oc_mcs.c:591
configuration structure for the memory region
Definition: oc_mcs.h:222
oC_InterruptPriotity_t oC_MCS_GetInterruptPriority(IRQn_Type InterruptNumber)
returns interrupt priority
Definition: oc_mcs.c:411
oC_Access_t PrivilegedAccess
Definition of access for privileged space (portable or core)
Definition: oc_mcs.h:229
The file with interface interrupt module.
void oC_MCS_DisableInterrupts(void)
Globally disables interrupts (always)
Definition: oc_mcs.c:346
bool oC_MCS_ReadFreeRegionNumber(uint32_t *outFreeRegionNumber)
reads number of a free region
Definition: oc_mcs.c:807
static bool oC_MCS_ExitCriticalSection(void)
Exits from critical section.
Definition: oc_mcs.h:784
void oC_MCS_EnableInterrupts(void)
Globally enables interrupts (always)
Definition: oc_mcs.c:331
#define kB(kBytes)
Number of kB.
Definition: oc_cfg.h:78
The lowest value for priority.
Definition: oc_mcs.h:177
oC_MCS_MemoryAccessMode_t oC_MCS_GetMemoryAccessMode(void)
reads memory access mode
Definition: oc_mcs.c:870
bool Shareable
For a shareable memory region that is implemented, the memory system provides data synchronization be...
Definition: oc_mcs.h:230
oC_Int_t BufferSize
Definition: oc_mcs.h:212
oC_Power_t Power
Power state for the region (enabled or disabled)
Definition: oc_mcs.h:227
bool oC_MCS_DisableInterrupt(IRQn_Type InterruptNumber)
disables interrupt with specified number
Definition: oc_mcs.c:379
#define MB(MBytes)
Number of MB.
Definition: oc_cfg.h:83
static oC_UInt_t oC_LSF_GetProcessStackSize(void)
returns size of the section in linkage
Definition: oc_lsf.h:438
static void * oC_LSF_GetProcessStackStart(void)
returns stack start address
Definition: oc_lsf.h:410
oC_Power_t
stores registers power state
Definition: oc_stdtypes.h:249
bool AlignSize
True if the MCS should find the size nearest to the value given as the Size field.
Definition: oc_mcs.h:226
uint32_t oC_MCS_GetMaximumNumberOfRegions(void)
returns maximum number of regions handled by the machine
Definition: oc_mcs.c:763
The most important interrupt priority, that is possible in the machine.
Definition: oc_mcs.h:178
#define NULL
pointer to a zero
Definition: oc_null.h:37