Important changes to forums and questions
All forums and questions are now archived. To start a new conversation or read the latest updates go to forums.mbed.com.
9 years, 1 month ago.
RTX, uvisor and interrupts
I'm having an issue with with interrupts using uVisor, every 2,3 interruptions occur, it generates a fault. Without uVisor, it works fine, is it a issue within uVisor? is there a way to solve partially the problem till the release of real solution, like disable irq before a switch context then enable them again?
This is my simple application :
main.cpp
#include "mbed.h"
#include "rtos.h"
#include "uvisor-lib/uvisor-lib.h"
#include "main.h"
extern "C" void SVC_Handler(void);
extern "C" void PendSV_Handler(void);
extern "C" void SysTick_Handler(void);
extern "C" uint32_t rt_suspend(void);
UVISOR_SET_PRIV_SYS_HOOKS(SVC_Handler, PendSV_Handler, SysTick_Handler, rt_suspend);
/* Main box Access Control Lists (ACLs). */
static const UvisorBoxAclItem g_main_box_acls[] = {
{GCR, sizeof(*GCR), UVISOR_TACLDEF_PERIPH},
{TMR0, sizeof(*TMR0), UVISOR_TACLDEF_PERIPH},
{GPIO0, sizeof(*GPIO0), UVISOR_TACLDEF_PERIPH},
{UART0, sizeof(*UART0), UVISOR_TACLDEF_PERIPH},
{(void *)0x42100000, 0x1000, UVISOR_TACLDEF_PERIPH},
};
/* Enable uVisor, using the ACLs we just created. */
UVISOR_SET_MODE_ACL(UVISOR_ENABLED, g_main_box_acls);
DigitalOut led2(LED2);
int main() {
while(1){
led2 = !led2;
Thread::wait(1000);
}
}
box1.cpp
#include "mbed.h"
#include "rtos.h"
#include "uvisor-lib/uvisor-lib.h"
#include "main.h"
#include "box_drivers.h"
/* Private static memory for the secure box */
typedef struct {
int thekey;
} Contextbox2;
static const UvisorBoxAclItem Thread_2_acls[] = {
};
static void Thread_2(const void *);
/* Secure box configuration */
UVISOR_BOX_NAMESPACE(NULL); /* We won't specify a box namespace for this example. */
UVISOR_BOX_HEAPSIZE(4096); /* Heap size for the secure box */
UVISOR_BOX_MAIN(Thread_2, /* Main thread for the secure box */
osPriorityNormal, /* Priority of the secure box's main thread */
1024); /* Stack size for the secure box's main thread */
UVISOR_BOX_CONFIG(box2, /* Name of the secure box */
Thread_2_acls, /* ACLs list for the secure box */
1024, /* Stack size for the secure box */
Contextbox2); /* Private static memory for the secure box. */
Serial pc(SERIAL_TX, SERIAL_RX);
DigitalOut led1(LED1);
static void but_func(void)
{
pc.printf("toto\r\n");
}
InterruptIn button(SW1);
/* Main thread for the secure box */
static void Thread_2(const void *)
{
button.mode(PullUp);
button.fall(&but_func);
while (true) {
led1 = !led1;
Thread::wait(1000);
}
}
after pushing the button a number of times, 2,3, 4.. a BusFault is generated, and it prints in the terminal :
"RTX error code: 0x00000001, task ID: 0x00000000"
And sometime it's a memfault :
948,729 @"***********************************************************\n" 948,762 @" MEMMANAGE FAULT\n" 948,795 @"***********************************************************\n" 948,808 @"\n" 948,841 @"* CFSR : 0x00000001\n" 948,874 @"\r\n" 948,907 @"\r* MMFAR : 0xE000ED34\n" 948,940 @"\r\n" 948,973 @"\r* No MPU violation found\n" 949,006 @"\r\n" 949,039 @"\r* MEMORY MAP\n" 949,071 @"\r Address: 0xE000ED34\n" 949,104 @"\r Region/Peripheral: [not available]\n" 949,117 @"\r Base address: 0xE000ED34\n" 949,150 @"\r End address: 0xE000ED34\n" 949,163 @"\r Before bitband: [invalid]\n" 949,176 @"\r\n" 949,189 @"\r* EXCEPTION STACK FRAME\n" 949,202 @" Exception from unprivileged code\n" 949,215 @" psp: 0x2000A2D8\n" 949,228 @"\r lr: 0xFFFFFFFD\n" 949,241 @"\r Exception stack frame:\n" 949,254 @" psp[07]: 0x00000000 | xPSR\n" 949,267 @" psp[06]: 0x21000000 | pc\n" 949,280 @" psp[05]: 0x21000000 | lr\n" 949,313 @" psp[04]: 0x10001DCC | r12\n" 949,326 @" psp[03]: 0x1000E81B | r3\n" 949,339 @" psp[02]: 0x1000CB29 | r2\n" 949,372 @" psp[01]: 0x2000AAD4 | r1\n" 949,385 @" psp[00]: 0x00000400 | r0\n" 949,398 @"\n" 949,431 @"* MPU CONFIGURATION\n" 949,444 @"\r\n" 949,457 @"\r Background region enabled\n" 949,470 @"\r MPU bypassed @NMI, @HardFault\n" 949,483 @"\r MPU enabled\n" 949,496 @"\r\n" 949,509 @"\r Region Start Size XN AP TEX S C B SRD Valid\n" 949,522 @"\r 0 0x10000000 128KB 0 110 000 0 0 0 00000000 1\n" 949,535 @"\r 1 0x20000000 128KB 0 011 000 0 0 0 00000011 1\n" 949,568 @"\r 2 0x42100000 004KB 1 011 000 0 0 0 00000000 1\n" 949,581 @"\r 3 0x40000000 064B 1 011 000 0 0 0 00000000 1\n" 949,594 @"\r 4 0x40010000 032B 1 011 000 0 0 0 00000000 1\n" 949,627 @"\r 5 0x40008000 256B 1 011 000 0 0 0 00000000 1\n" 949,660 @"\r 6 0x40020000 064B 1 011 000 0 0 0 00000000 1\n" 949,673 @"\r 7 0x42100000 004KB 1 011 000 0 0 0 00000000 1\n" 949,686 @"\r\n" 949,719 @"\r***********************************************************\n" 949,732 @"\n" 949,745 @"HALT_ERROR(./core/system/src/mpu/vmpu_armv7m.c#157): Access to restricted resource denied\\
1 Answer
9 years, 1 month ago.
This issue mentions that the Thread.wait calls in the box that own the interrupt might be at fault. Why that's the case, I wouldn't know, but track that issue for updates.
Created a bug for the uVisor team here: https://github.com/ARMmbed/uvisor/issues/327.
posted by Jan Jongboom 15 Sep 2016