Files
mkrtos-real/mkrtos_knl/arch/armv7m/stm32f2/mpu.c
2024-03-03 15:36:22 +08:00

75 lines
1.6 KiB
C
Executable File

/*
* mpu.c
*
* Created on: ATShining
* Author: Administrator
*/
#include "types.h"
#include "mpu.h"
#include <mk_sys.h>
#include <mpu_armv7.h>
#include "thread.h"
#include "task.h"
#if CONFIG_MK_MPU_CFG
static volatile umword_t *MPUCR = (umword_t *)0xE000ED94;
void mpu_init(void)
{
mpu_enable();
}
void mpu_disable(void)
{
ARM_MPU_Disable();
}
void mpu_enable(void)
{
ARM_MPU_Enable(4);
}
void mpu_calc_regs(region_info_t *region, umword_t addr, umword_t ffs_val, uint8_t attrs, uint8_t regions_bits)
{
region->rbar = ARM_MPU_RBAR(region->region_inx, addr);
region->rasr = ARM_MPU_RASR(0, attrs, 0UL, 0UL,
1UL, 1UL, regions_bits, ffs(ffs_val) - 1);
}
void mpu_region_set(int inx, umword_t rbar, umword_t rasr)
{
mpu_disable();
ARM_MPU_SetRegionEx(inx, rbar, rasr);
mpu_enable();
}
void mpu_region_clr(int inx)
{
ARM_MPU_ClrRegion(inx);
}
void mpu_switch_to_task(struct task *tk)
{
mpu_disable();
for (int i = 0; i < CONFIG_REGION_NUM; i++)
{
if (tk->mm_space.pt_regions[i].region_inx >= 0)
{
ARM_MPU_SetRegionEx(tk->mm_space.pt_regions[i].region_inx, tk->mm_space.pt_regions[i].rbar,
tk->mm_space.pt_regions[i].rasr);
}
else
{
ARM_MPU_ClrRegion(i);
}
}
mpu_enable();
}
void mpu_switch_to(void)
{
struct task *tk = thread_get_current_task();
mpu_switch_to_task(tk);
}
#else
void mpu_switch_to(void)
{
}
void mpu_switch_to_task(struct task *tk)
{
}
#endif