5454#define RAM_CODE __attribute__ ((section(" .ram_code" )))
5555
5656// Memory Bank Symbols from Linker
57- extern "C" uint32_t __itcm_base;
58- extern " C" uint32_t __itcm_size;
59- extern " C" uint32_t __dtcm_base;
60- extern " C" uint32_t __dtcm_size;
61- extern " C" uint32_t __flash_base;
62- extern " C" uint32_t __flash_size;
63- extern " C" uint32_t __ram_d1_base;
64- extern " C" uint32_t __ram_d1_size;
65- extern " C" uint32_t __ram_d2_base;
66- extern " C" uint32_t __ram_d2_size;
67- extern " C" uint32_t __ram_d3_base;
68- extern " C" uint32_t __ram_d3_size;
69- extern " C" uint32_t __peripheral_base;
70- extern " C" uint32_t __peripheral_size;
57+ extern "C" const uintptr_t __itcm_base;
58+ extern " C" const size_t __itcm_size;
59+ extern " C" const uintptr_t __dtcm_base;
60+ extern " C" const size_t __dtcm_size;
61+ extern " C" const uintptr_t __flash_base;
62+ extern " C" const size_t __flash_size;
63+ extern " C" const uintptr_t __ram_d1_base;
64+ extern " C" const size_t __ram_d1_size;
65+ extern " C" const uintptr_t __ram_d2_base;
66+ extern " C" const size_t __ram_d2_size;
67+ extern " C" const uintptr_t __ram_d3_base;
68+ extern " C" const size_t __ram_d3_size;
69+ extern " C" const uintptr_t __peripheral_base;
70+ extern " C" const size_t __peripheral_size;
7171
7272// MPU Non-Cached Section Symbols from Linker
73- extern " C" uint32_t __mpu_d1_nc_start;
74- extern " C" uint32_t __mpu_d1_nc_end;
75- extern " C" uint32_t __mpu_d2_nc_start;
76- extern " C" uint32_t __mpu_d2_nc_end;
77- extern " C" uint32_t __mpu_d3_nc_start;
78- extern " C" uint32_t __mpu_d3_nc_end;
73+ extern " C" const uintptr_t __mpu_d1_nc_start;
74+ extern " C" const uintptr_t __mpu_d1_nc_end;
75+ extern " C" const uintptr_t __mpu_d2_nc_start;
76+ extern " C" const uintptr_t __mpu_d2_nc_end;
77+ extern " C" const uintptr_t __mpu_d3_nc_start;
78+ extern " C" const uintptr_t __mpu_d3_nc_end;
7979
8080
8181template <typename T>
@@ -288,9 +288,9 @@ struct MPUDomain {
288288 configure_static_regions ();
289289
290290 // Dynamic Configuration based on Linker Symbols
291- configure_dynamic_region ((uint32_t )& __mpu_d1_nc_start, (uint32_t )& __mpu_d1_nc_end, MPU_REGION_NUMBER3);
292- configure_dynamic_region ((uint32_t )& __mpu_d2_nc_start, (uint32_t )& __mpu_d2_nc_end, MPU_REGION_NUMBER5);
293- configure_dynamic_region ((uint32_t )& __mpu_d3_nc_start, (uint32_t )& __mpu_d3_nc_end, MPU_REGION_NUMBER7);
291+ configure_dynamic_region ((uintptr_t ) __mpu_d1_nc_start, (uintptr_t ) __mpu_d1_nc_end, MPU_REGION_NUMBER3);
292+ configure_dynamic_region ((uintptr_t ) __mpu_d2_nc_start, (uintptr_t ) __mpu_d2_nc_end, MPU_REGION_NUMBER5);
293+ configure_dynamic_region ((uintptr_t ) __mpu_d3_nc_start, (uintptr_t ) __mpu_d3_nc_end, MPU_REGION_NUMBER7);
294294
295295 // Assign pointers
296296 uint8_t * bases_nc[3 ] = { &d1_nc_buffer[0 ], &d2_nc_buffer[0 ], &d3_nc_buffer[0 ] };
@@ -321,7 +321,7 @@ struct MPUDomain {
321321 private:
322322 static constexpr std::size_t alignments[6 ] = {32 , 16 , 8 , 4 , 2 , 1 };
323323
324- static void configure_dynamic_region (uint32_t start, uint32_t end, uint8_t region_num) {
324+ static void configure_dynamic_region (uintptr_t start, uintptr_t end, uint8_t region_num) {
325325 if (end <= start) return ;
326326 configure_region (start, end - start, region_num,
327327 MPU_TEX_LEVEL1, MPU_REGION_FULL_ACCESS, MPU_INSTRUCTION_ACCESS_DISABLE,
@@ -348,47 +348,47 @@ struct MPUDomain {
348348
349349 // Peripherals (Device, Buffered)
350350 // Guarded against speculative execution and cache
351- configure_region (( uint32_t )& __peripheral_base, ( uint32_t )& __peripheral_size, MPU_REGION_NUMBER8,
351+ configure_region (__peripheral_base, __peripheral_size, MPU_REGION_NUMBER8,
352352 MPU_TEX_LEVEL0, MPU_REGION_FULL_ACCESS, MPU_INSTRUCTION_ACCESS_DISABLE,
353353 MPU_ACCESS_SHAREABLE, MPU_ACCESS_NOT_CACHEABLE, MPU_ACCESS_BUFFERABLE);
354354
355355 // Flash (Normal, Cacheable)
356356 // TEX=1, C=1, B=0: Normal, Write-Through (Read optimized)
357357 // Not Shareable to allow full caching
358- configure_region (( uint32_t )& __flash_base, ( uint32_t )& __flash_size, MPU_REGION_NUMBER1,
358+ configure_region (__flash_base, __flash_size, MPU_REGION_NUMBER1,
359359 MPU_TEX_LEVEL1, MPU_REGION_FULL_ACCESS, MPU_INSTRUCTION_ACCESS_ENABLE,
360360 MPU_ACCESS_NOT_SHAREABLE, MPU_ACCESS_CACHEABLE, MPU_ACCESS_NOT_BUFFERABLE);
361361
362362 // DTCM (Normal, Cacheable)
363363 // Uses Normal memory attributes. TCM access is uncached by hardware, but "Normal" allows unaligned access.
364- configure_region (( uint32_t )& __dtcm_base, ( uint32_t )& __dtcm_size, MPU_REGION_NUMBER10,
364+ configure_region (__dtcm_base, __dtcm_size, MPU_REGION_NUMBER10,
365365 MPU_TEX_LEVEL1, MPU_REGION_FULL_ACCESS, MPU_INSTRUCTION_ACCESS_DISABLE,
366366 MPU_ACCESS_NOT_SHAREABLE, MPU_ACCESS_CACHEABLE, MPU_ACCESS_BUFFERABLE);
367367
368368 // ITCM (Normal, Cacheable)
369- configure_region (( uint32_t )& __itcm_base, ( uint32_t )& __itcm_size, MPU_REGION_NUMBER11,
369+ configure_region (__itcm_base, __itcm_size, MPU_REGION_NUMBER11,
370370 MPU_TEX_LEVEL1, MPU_REGION_FULL_ACCESS, MPU_INSTRUCTION_ACCESS_ENABLE,
371371 MPU_ACCESS_NOT_SHAREABLE, MPU_ACCESS_CACHEABLE, MPU_ACCESS_BUFFERABLE);
372372
373373 // D1 RAM Cached (Normal, WBWA)
374374 // TEX=1, C=1, B=1: Normal, Write-Back, Write-Allocate
375375 // Not Shareable ensures strict L1 utilization.
376- configure_region (( uint32_t )& __ram_d1_base, ( uint32_t )& __ram_d1_size, MPU_REGION_NUMBER2,
376+ configure_region (__ram_d1_base, __ram_d1_size, MPU_REGION_NUMBER2,
377377 MPU_TEX_LEVEL1, MPU_REGION_FULL_ACCESS, MPU_INSTRUCTION_ACCESS_DISABLE,
378378 MPU_ACCESS_NOT_SHAREABLE, MPU_ACCESS_CACHEABLE, MPU_ACCESS_BUFFERABLE);
379379
380380 // D2 RAM Cached (Normal, WBWA)
381- configure_region (( uint32_t )& __ram_d2_base, ( uint32_t )& __ram_d2_size, MPU_REGION_NUMBER4,
381+ configure_region (__ram_d2_base, __ram_d2_size, MPU_REGION_NUMBER4,
382382 MPU_TEX_LEVEL1, MPU_REGION_FULL_ACCESS, MPU_INSTRUCTION_ACCESS_DISABLE,
383383 MPU_ACCESS_NOT_SHAREABLE, MPU_ACCESS_CACHEABLE, MPU_ACCESS_BUFFERABLE);
384384
385385 // D3 RAM Cached (Normal, WBWA)
386- configure_region (( uint32_t )& __ram_d3_base, ( uint32_t )& __ram_d3_size, MPU_REGION_NUMBER6,
386+ configure_region (__ram_d3_base, __ram_d3_size, MPU_REGION_NUMBER6,
387387 MPU_TEX_LEVEL1, MPU_REGION_FULL_ACCESS, MPU_INSTRUCTION_ACCESS_DISABLE,
388388 MPU_ACCESS_NOT_SHAREABLE, MPU_ACCESS_CACHEABLE, MPU_ACCESS_BUFFERABLE);
389389 }
390390
391- static void configure_region (uint32_t base, uint32_t size, uint8_t region_num,
391+ static void configure_region (uintptr_t base, size_t size, uint8_t region_num,
392392 uint8_t tex, uint8_t access, uint8_t no_exec,
393393 uint8_t shareable, uint8_t cacheable, uint8_t bufferable) {
394394 if (size == 0 ) return ;
@@ -400,7 +400,7 @@ struct MPUDomain {
400400 if (size > 32 ) {
401401 // Calculate ceil(log2(size)) - 1
402402 // __builtin_clz(x) returns leading zeros. For 32, it's 26: 31 - 26 = 5
403- mpu_size = 31 - __builtin_clz (size - 1 );
403+ mpu_size = ( sizeof (size) * 8 - 1 ) - __builtin_clz (size - 1 );
404404 }
405405
406406 // Calculate SubRegion Disable (SRD)
@@ -414,7 +414,7 @@ struct MPUDomain {
414414 MPU_Region_InitTypeDef MPU_InitStruct = {0 };
415415 MPU_InitStruct.Enable = MPU_REGION_ENABLE;
416416 MPU_InitStruct.Number = region_num;
417- MPU_InitStruct.BaseAddress = base;
417+ MPU_InitStruct.BaseAddress = static_cast < decltype (MPU_InitStruct. BaseAddress )>( base); // Should be uint32_t, but may be different when mocking, so this is just to make sure it accepts it
418418 MPU_InitStruct.Size = mpu_size;
419419 MPU_InitStruct.SubRegionDisable = srd;
420420 MPU_InitStruct.TypeExtField = tex;
0 commit comments