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 __ICACHE_PRESENT 1
291 #define __DCACHE_PRESENT 1
292 #define __MPU_PRESENT 1
293 
294 #include <core_cm7.h>
295 
296 //==========================================================================================================================================
300 //==========================================================================================================================================
302 {
303  /* This assertion fails, when process stack size is configured too small in linker configuration file */
305 
306  /* Initialization of the system stack */
307  SystemStack = oC_LSF_GetProcessStackStart();
308  SystemStack->Buffer = oC_LSF_GetProcessStackStart() + oC_MCS_AlignSize(sizeof(oC_StackData_t), oC_MCS_MEMORY_ALIGNMENT);
309  SystemStack->BufferSize = oC_LSF_GetProcessStackSize() - oC_MCS_AlignSize(sizeof(oC_StackData_t), oC_MCS_MEMORY_ALIGNMENT);
311 
312  /* At the start current stack is the system stack */
313  CurrentStack = SystemStack;
314 
315  /* Enable I-Cache */
316  SCB_EnableICache();
317 
318  /* Enable D-Cache */
319  SCB_EnableDCache();
320 
321  return true;
322 }
323 
324 //==========================================================================================================================================
328 //==========================================================================================================================================
330 {
331  return (void*)SCB->BFAR;
332 }
333 
334 //==========================================================================================================================================
338 //==========================================================================================================================================
340 {
341  __set_PRIMASK(0);
342  __set_BASEPRI(0);
343  __asm("cpsie i");
344  __asm volatile( "dsb" );
345  __asm volatile( "isb" );
346 }
347 
348 //==========================================================================================================================================
353 //==========================================================================================================================================
355 {
356  __set_PRIMASK(1);
357  __set_BASEPRI(0xFF);
358 }
359 
360 //==========================================================================================================================================
364 //==========================================================================================================================================
366 {
367  uint32_t basepri = __get_BASEPRI();
368 
369  return basepri == 0;
370 }
371 
372 //==========================================================================================================================================
376 //==========================================================================================================================================
377 bool oC_MCS_EnableInterrupt( IRQn_Type InterruptNumber )
378 {
379  if(InterruptNumber >= 0)
380  {
381  NVIC_EnableIRQ(InterruptNumber);
382  return true;
383  }
384  else
385  {
386  return false;
387  }
388 }
389 
390 //==========================================================================================================================================
394 //==========================================================================================================================================
395 bool oC_MCS_DisableInterrupt( IRQn_Type InterruptNumber )
396 {
397  if(InterruptNumber >= 0)
398  {
399  NVIC_DisableIRQ(InterruptNumber);
400  return true;
401  }
402  else
403  {
404  return false;
405  }
406 }
407 
408 //==========================================================================================================================================
412 //==========================================================================================================================================
413 bool oC_MCS_IsInterruptEnabled( IRQn_Type InterruptNumber )
414 {
415  return (NVIC->ISER[(uint32_t)((int32_t)InterruptNumber) >> 5] & (uint32_t)(1 << ((uint32_t)((int32_t)InterruptNumber) & (uint32_t)0x1F))) != 0;
416 }
417 
418 //==========================================================================================================================================
422 //==========================================================================================================================================
424 {
425  NVIC_SetPriority(InterruptNumber , Priority);
426  return true;
427 }
428 
429 //==========================================================================================================================================
433 //==========================================================================================================================================
435 {
436  return NVIC_GetPriority(InterruptNumber);
437 }
438 
439 //==========================================================================================================================================
443 //==========================================================================================================================================
444 void oC_MCS_Reboot( void )
445 {
446  NVIC_SystemReset();
447  while(1);
448 }
449 
450 //==========================================================================================================================================
454 //==========================================================================================================================================
456  oC_Stack_t * outStack ,
457  void * Buffer ,
458  oC_Int_t BufferSize ,
459  oC_ContextHandler_t ContextHandler ,
460  void * HandlerParameter ,
461  oC_ContextExitHandler_t ExitHandler
462  )
463 {
464  bool success = false;
465 
466  if(
467  BufferSize > oC_MCS_GetMinimumStackBufferSize(0) &&
468  IsRam(Buffer) &&
469  IsRam(outStack) &&
470  oC_LSF_IsCorrectAddress(ContextHandler) &&
471  oC_LSF_IsCorrectAddress(ExitHandler)
472  )
473  {
474  /* ============================================
475  *
476  * --------------- [ Buffer ] -----------------
477  *
478  * This part of buffer is free stack
479  *
480  * --------------- [context] ------------------
481  *
482  * This part of buffer is initialized at the
483  * start as machine context
484  *
485  * ---------------- [stack] -------------------
486  * This part of buffer is for storing stack
487  * data
488  * -------------- [ bufferEnd ] ---------------
489  *
490  * ============================================ */
491  void * bufferEnd = &(((uint8_t*)Buffer)[BufferSize]);
492  oC_Stack_t stack = oC_MCS_AlignStackPointer(bufferEnd - sizeof(oC_StackData_t) - sizeof(uint32_t));
493  Context_t * context = oC_MCS_AlignStackPointer(stack - sizeof(Context_t));
494 
495  if((((void*)stack) > Buffer) && (((void*)context) > Buffer))
496  {
497  /* Initializing registers of machine (in first start of this, it will be read by the hardware) */
498  context->PC = (oC_UInt_t)ContextHandler; /* Program Counter set to the context handler function */
499  context->xPSR = oC_MCS_xPSR_INITIAL_VALUE; /* Initial value for the xPSR */
500  context->LR = (oC_UInt_t)ExitHandler; /* Link Register (address of return) */
501  context->R0 = (oC_UInt_t)HandlerParameter; /* Parameters pointer will be given to the r0 register */
502  context->R1 = 0;
503  context->R2 = 0;
504  context->R3 = 0;
505  context->R4 = 0;
506  context->R5 = 0;
507  context->R6 = 0;
508  context->R7 = 0;
509  context->R8 = 0;
510  context->R9 = 0;
511  context->R10 = 0;
512  context->R11 = 0;
513  context->R12 = 0;
514 
515  stack->StackPointer = (void*)context;
516  stack->Buffer = Buffer;
517  stack->BufferSize = BufferSize;
518 
519  *outStack = stack;
520  success = true;
521 
522  }
523  }
524 
525  return success;
526 }
527 
528 //==========================================================================================================================================
532 //==========================================================================================================================================
534 {
535  return (void*) __get_PSP();
536 }
537 
538 //==========================================================================================================================================
542 //==========================================================================================================================================
544 {
545  return (void*) __get_MSP();
546 }
547 //==========================================================================================================================================
551 //==========================================================================================================================================
553 {
554  oC_Int_t stackSize = 0;
555 
556  if(Stack == NULL)
557  {
558  Stack = CurrentStack;
559  }
560 
561  if(IsStackCorrect(Stack))
562  {
563  stackSize = Stack->BufferSize;
564  }
565 
566  return stackSize;
567 }
568 
569 //==========================================================================================================================================
573 //==========================================================================================================================================
575 {
576  oC_Int_t freeStackSize = 0;
577 
578  if(Stack == NULL)
579  {
580  Stack = CurrentStack;
581  }
582 
583  if(IsRam(Stack))
584  {
585  void * currentStackPointer = NULL;
586 
587  if(CurrentStack == Stack)
588  {
589  currentStackPointer = oC_MCS_GetCurrentProcessStackPointer();
590  }
591  else
592  {
593  currentStackPointer = Stack->StackPointer;
594  }
595 
596  if(currentStackPointer >= ((void*)Stack->Buffer))
597  {
598  freeStackSize = (oC_Int_t)(currentStackPointer - ((void*)Stack->Buffer));
599  }
600  else
601  {
602  freeStackSize -= (oC_Int_t)(((void*)Stack->Buffer) - currentStackPointer);
603  }
604  }
605 
606  return freeStackSize;
607 }
608 
609 //==========================================================================================================================================
613 //==========================================================================================================================================
615 {
616  return CurrentStack;
617 }
618 
619 //==========================================================================================================================================
623 //==========================================================================================================================================
624 oC_Int_t oC_MCS_GetMinimumStackBufferSize( oC_Int_t StackSize )
625 {
626  return oC_MCS_AlignSize(sizeof(Context_t), oC_MCS_STACK_MEMORY_ALIGNMENT) +
627  oC_MCS_AlignSize(sizeof(oC_StackData_t), oC_MCS_MEMORY_ALIGNMENT) +
628  oC_MCS_AlignSize(StackSize , oC_MCS_STACK_MEMORY_ALIGNMENT);
629 }
630 
631 //==========================================================================================================================================
635 //==========================================================================================================================================
637 {
638  bool stackSwitched = false;
639 
640  if(IsStackCorrect(Stack))
641  {
643  NextStack = Stack;
645 
646  stackSwitched = true;
647  }
648 
649  return stackSwitched;
650 }
651 
652 //==========================================================================================================================================
656 //==========================================================================================================================================
657 bool oC_MCS_ConfigureSystemTimer( oC_UInt_t Prescaler , oC_FindNextStackHandler_t FindNextStackHandler )
658 {
659  bool configured = false;
660 
661  if(Prescaler > 0 && oC_LSF_IsCorrectAddress(FindNextStackHandler))
662  {
663  if(SysTick_Config(Prescaler) == 0)
664  {
665  NVIC_SetPriority( PendSV_IRQn , oC_InterruptPriority_Minimum - 1);
666  NVIC_SetPriority( SysTick_IRQn , oC_InterruptPriority_Maximum + 1);
667 
668  GlobalFindNextStackHandler = FindNextStackHandler;
669 
670  configured = true;
671  }
672  }
673 
674  return configured;
675 }
676 
677 //==========================================================================================================================================
681 //==========================================================================================================================================
683 {
684  return SystemStack;
685 }
686 
687 //==========================================================================================================================================
691 //==========================================================================================================================================
693 {
694  return oC_MCS_SetNextStack(SystemStack);
695 }
696 
697 //==========================================================================================================================================
701 //==========================================================================================================================================
702 void oC_MCS_Delay( register oC_UInt_t Cycles )
703 {
704  Cycles /= 1; // 1 clock cycles per loop
705  if(Cycles>0)
706  {
707  __asm volatile(
708  "mov r3, %[Cycles] \n\t"
709  "loop: \n\t"
710  "subs r3, #1 \n\t"
711  "bne loop \n\t"
712  :
713  : [Cycles] "r" (Cycles)
714  );
715  }
716 }
717 
718 
719 //==========================================================================================================================================
723 //==========================================================================================================================================
725 {
726  oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
727 
728  if(
729  ErrorCondition(IsCorrect(Config) , oC_ErrorCode_WrongAddress )
730  && ErrorCondition(IsCorrect(Config->BaseAddress) , oC_ErrorCode_WrongAddress )
731  && ErrorCondition(Config->Size > 0 , oC_ErrorCode_SizeNotCorrect )
732  && ErrorCondition(Config->RegionNumber < oC_MCS_GetMaximumNumberOfRegions() , oC_ErrorCode_RegionNumberNotCorrect )
733  )
734  {
735  oC_MemorySize_t foundRegionSize = 0;
736  uint8_t accessPermissions = 0;
737  uint8_t disableExecution = oC_Bits_AreBitsSetU32(Config->UserAccess | Config->PrivilegedAccess , oC_Access_Execute) ? 0 : 1;
738  uint8_t sizeId = 0;
739 
740  oC_Procedure_Begin
741  {
742  foundRegionSize = FindMemoryRegionSize(Config->Size,Config->AlignSize,&sizeId);
743  accessPermissions = FindAccessPermissions(Config->UserAccess,Config->PrivilegedAccess);
744 
745  oC_Procedure_ExitIfFalse( foundRegionSize >= Config->Size , oC_ErrorCode_SizeNotCorrect);
746  oC_Procedure_ExitIfFalse( accessPermissions < 0xFF , oC_ErrorCode_AccessPermissionsNotPossible);
747  oC_Procedure_ExitIfFalse( IsAligned(Config->BaseAddress,foundRegionSize) , oC_ErrorCode_AddressNotAligned);
748  oC_Procedure_ExitIfFalse(
751  oC_ErrorCode_AccessPermissionsNotCorrect);
752  oC_Procedure_ExitIfFalse(
755  oC_ErrorCode_AccessPermissionsNotCorrect);
756 
757  SetPowerForMpu(oC_Power_Off);
758  MPU->RNR = Config->RegionNumber;
759  MPU->RBAR = (uint32_t)Config->BaseAddress;
760  MPU->RASR = ((uint32_t)disableExecution << MPU_RASR_XN_Pos) |
761  ((uint32_t)accessPermissions << MPU_RASR_AP_Pos) |
762  ((uint32_t)0x00 << MPU_RASR_TEX_Pos) |
763  (((uint32_t)Config->Shareable ? 1 : 0) << MPU_RASR_S_Pos) |
764  (((uint32_t)Config->Cacheable ? 1 : 0) << MPU_RASR_C_Pos) |
765  (((uint32_t)Config->Bufforable ? 1 : 0) << MPU_RASR_B_Pos) |
766  ((uint32_t)0x00 << MPU_RASR_SRD_Pos) |
767  ((uint32_t)sizeId << MPU_RASR_SIZE_Pos) |
768  ((uint32_t)Config->Power == oC_Power_On ? 1 : 0 << MPU_RASR_ENABLE_Pos);
769 
770  SetPowerForMpu(oC_Power_On);
771 
772  errorCode = oC_ErrorCode_None;
773  }
774  oC_Procedure_End;
775 
776  }
777 
778  return errorCode;
779 }
780 
781 //==========================================================================================================================================
785 //==========================================================================================================================================
787 {
788  return (MPU->TYPE & MPU_TYPE_DREGION_Msk) >> MPU_TYPE_DREGION_Pos;
789 }
790 
791 //==========================================================================================================================================
795 //==========================================================================================================================================
797 {
798  uint32_t numberOfRegions = 0;
799  uint32_t maxNumberOfRegions = oC_MCS_GetMaximumNumberOfRegions();
800  oC_Power_t savedPowerState = oC_Power_Off;
801 
803 
804  savedPowerState = GetPowerOfMpu();
805 
806  SetPowerForMpu(oC_Power_Off);
807 
808  for(uint32_t i = 0 ; i < maxNumberOfRegions ; i++)
809  {
810  MPU->RNR = i;
811 
812  if(oC_Bits_AreBitsSetU32(MPU->RASR, MPU_RASR_ENABLE_Msk))
813  {
814  numberOfRegions++;
815  }
816  }
817 
818  SetPowerForMpu(savedPowerState);
819 
821 
822  return numberOfRegions;
823 }
824 
825 //==========================================================================================================================================
829 //==========================================================================================================================================
830 bool oC_MCS_ReadFreeRegionNumber( uint32_t * outFreeRegionNumber )
831 {
832  bool found = false;
833 
834  if(IsRam(outFreeRegionNumber))
835  {
836  uint32_t maxNumberOfRegions = oC_MCS_GetMaximumNumberOfRegions();
837  oC_Power_t savedPowerState = oC_Power_Off;
838 
840 
841  savedPowerState = GetPowerOfMpu();
842 
843  SetPowerForMpu(oC_Power_Off);
844 
845  for(uint32_t i = 0 ; i < maxNumberOfRegions ; i++)
846  {
847  MPU->RNR = i;
848 
849  if(oC_Bits_AreBitsClearU32(MPU->RASR, MPU_RASR_ENABLE_Msk))
850  {
851  *outFreeRegionNumber = i;
852  found = true;
853  break;
854  }
855  }
856 
857  SetPowerForMpu(savedPowerState);
858 
860  }
861 
862  return found;
863 }
864 
865 //==========================================================================================================================================
869 //==========================================================================================================================================
871 {
872  bool success = false;
873 
875  {
876  MPU->CTRL |= MPU_CTRL_PRIVDEFENA_Msk;
877  success = true;
878  }
879  else if(Mode == oC_MCS_MemoryAccessMode_User)
880  {
881  MPU->CTRL &= ~MPU_CTRL_PRIVDEFENA_Msk;
882  success = true;
883  }
884 
885  return success;
886 }
887 
888 //==========================================================================================================================================
892 //==========================================================================================================================================
894 {
895  return ((MPU->CTRL & MPU_CTRL_PRIVDEFENA_Msk) != 0)
896  || ((MPU->CTRL & MPU_CTRL_ENABLE_Msk) == 0)
898 }
899 
900 #undef _________________________________________INTERFACE_FUNCTIONS_SECTION________________________________________________________________
901 
907 #define _________________________________________LOCAL_FUNCTIONS_SECTION____________________________________________________________________
908 
909 //==========================================================================================================================================
913 //==========================================================================================================================================
914 static inline void TriggerPendSV(void)
915 {
916  SCB->ICSR |= SCB_ICSR_PENDSVSET_Msk;
917 }
918 
919 //==========================================================================================================================================
923 //==========================================================================================================================================
924 static bool IsStackCorrect( oC_Stack_t Stack )
925 {
926  return IsRam(Stack) &&
928  (Stack->StackPointer < (Stack->Buffer + Stack->BufferSize)) &&
929  (Stack->StackPointer >= (Stack->Buffer));
930 }
931 
932 //==========================================================================================================================================
944 //==========================================================================================================================================
945 static oC_MemorySize_t FindMemoryRegionSize( oC_MemorySize_t Size , bool AlignSize , uint8_t * outSizeId )
946 {
947  oC_MemorySize_t foundSize = 0;
948  uint8_t sizeId = 0;
949 
950  /* Searching for the size */
951  oC_ARRAY_FOREACH_IN_ARRAY(PossibleMemoryRegionSizes,regionSize)
952  {
953  if((*regionSize) > 0)
954  {
955  if((*regionSize) == Size)
956  {
957  foundSize = *regionSize;
958  break;
959  }
960  else if(AlignSize)
961  {
962  foundSize = *regionSize;
963 
964  if(foundSize > Size)
965  {
966  break;
967  }
968  }
969  }
970  sizeId++;
971  }
972 
973  if(foundSize > 0)
974  {
975  *outSizeId = sizeId;
976  }
977 
978  return foundSize;
979 }
980 
981 //==========================================================================================================================================
987 //==========================================================================================================================================
988 static uint8_t FindAccessPermissions( oC_Access_t User , oC_Access_t Privileged )
989 {
990  uint8_t foundAccessPermissions = 0xFF;
991  uint8_t arraySize = oC_ARRAY_SIZE(PossibleAccessPermissions);
992 
993  /* Only RW flags are stored in the array */
994  User &= oC_Access_RW;
995  Privileged &= oC_Access_RW;
996 
997  for(uint8_t i = 0; i < arraySize ; i++)
998  {
999  if(User == PossibleAccessPermissions[i].User && Privileged == PossibleAccessPermissions[i].Privileged)
1000  {
1001  foundAccessPermissions = i;
1002  }
1003  }
1004 
1005  return foundAccessPermissions;
1006 }
1007 
1008 //==========================================================================================================================================
1012 //==========================================================================================================================================
1013 static void SetPowerForMpu( oC_Power_t Power )
1014 {
1015  if(Power == oC_Power_On)
1016  {
1017  /* Enable the MPU */
1018  MPU->CTRL |= MPU_CTRL_ENABLE_Msk;
1019 
1020  /* Enable fault exceptions */
1021  SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk;
1022  }
1023  else
1024  {
1025  /* Disable fault exceptions */
1026  SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk;
1027 
1028  /* Disable the MPU */
1029  MPU->CTRL &= ~MPU_CTRL_ENABLE_Msk;
1030  }
1031 }
1032 
1033 //==========================================================================================================================================
1037 //==========================================================================================================================================
1038 static oC_Power_t GetPowerOfMpu( void )
1039 {
1040  return oC_Bits_AreBitsSetU32(MPU->CTRL , MPU_CTRL_ENABLE_Msk) ? oC_Power_On : oC_Power_Off;
1041 }
1042 
1043 #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