48 lines
1.1 KiB
C
Executable File
48 lines
1.1 KiB
C
Executable File
/*
|
|
* mpu.c
|
|
*
|
|
* Created on: zhangzheng
|
|
* Author: Administrator
|
|
*/
|
|
|
|
#include "types.h"
|
|
#include "assert.h"
|
|
#include "mpu.h"
|
|
#include <stm32f2xx.h>
|
|
#include <mpu_armv7.h>
|
|
#include "task.h"
|
|
static volatile umword_t *MPUCR = (umword_t *)0xE000ED94;
|
|
|
|
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, int ffs, 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 - 1);
|
|
}
|
|
void mpu_switch_to(void)
|
|
{
|
|
struct task *tk = thread_get_current_task();
|
|
mpu_disable();
|
|
for (int i = 0; i < REGION_NUM; i++)
|
|
{
|
|
if (tk->mm_space.pt_regions[i].region_inx >= 0)
|
|
{
|
|
ARM_MPU_SetRegion(tk->mm_space.pt_regions[i].rbar,
|
|
tk->mm_space.pt_regions[i].rasr);
|
|
}
|
|
else
|
|
{
|
|
ARM_MPU_ClrRegion(i);
|
|
}
|
|
}
|
|
mpu_enable();
|
|
}
|