Fixed a problem in SB VRQs preemption.
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@15636 27425a3e-05d8-49a3-a47f-9c15f0e5edd8
This commit is contained in:
parent
ae718c401a
commit
6003c5b30b
|
@ -23,6 +23,8 @@ void __crt0_vrq(int vrqn) {
|
||||||
|
|
||||||
(void)vrqn;
|
(void)vrqn;
|
||||||
|
|
||||||
|
printf("#1 Hello World (%u)!!\r\n", (unsigned)0);
|
||||||
|
|
||||||
__sb_vrq_return();
|
__sb_vrq_return();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -38,12 +40,13 @@ int main(void) {
|
||||||
while (true) {
|
while (true) {
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
__sb_vrq_seten(2);
|
__sb_vrq_seten(1);
|
||||||
__sb_vrq_setwt(2);
|
// __sb_vrq_setwt(1);
|
||||||
|
sbSetAlarm(sbTimeMS2I(300), true);
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
msg_t msg = sbMsgWait();
|
msg_t msg = sbMsgWait();
|
||||||
printf("#1 Hello World (%u)!!\r\n", (unsigned)msg);
|
// printf("#1 Hello World (%u)!!\r\n", (unsigned)msg);
|
||||||
// sbFileWrite(1U, (const uint8_t *)"#1 Hello World!!\r\n", 15U);
|
// sbFileWrite(1U, (const uint8_t *)"#1 Hello World!!\r\n", 15U);
|
||||||
sbMsgReply(msg);
|
sbMsgReply(msg);
|
||||||
// sbSleepMilliseconds(500);
|
// sbSleepMilliseconds(500);
|
||||||
|
|
|
@ -188,7 +188,7 @@ void sbVRQTriggerFromISR(sb_class_t *sbp, sb_vrqmask_t vmask) {
|
||||||
if ((sbp->tp->state == CH_STATE_CURRENT)) {
|
if ((sbp->tp->state == CH_STATE_CURRENT)) {
|
||||||
/* Sandbox case, getting the current exception frame.*/
|
/* Sandbox case, getting the current exception frame.*/
|
||||||
if ((__get_CONTROL() & 1U) == 0U) {
|
if ((__get_CONTROL() & 1U) == 0U) {
|
||||||
/* If preempted in privileged mode then getting the store U_PSP
|
/* If preempted in privileged mode then getting the stored U_PSP
|
||||||
value.*/
|
value.*/
|
||||||
ectxp = (struct port_extctx *)sbp->tp->ctx.syscall.u_psp;
|
ectxp = (struct port_extctx *)sbp->tp->ctx.syscall.u_psp;
|
||||||
}
|
}
|
||||||
|
@ -213,9 +213,8 @@ void sbVRQTriggerFromISR(sb_class_t *sbp, sb_vrqmask_t vmask) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* Other thread case, getting the pointer from the context switch
|
/* Getting the stored U_PSP value.*/
|
||||||
structure.*/
|
ectxp = (struct port_extctx *)sbp->tp->ctx.syscall.u_psp;
|
||||||
ectxp = sbp->tp->ctx.sp;
|
|
||||||
newctxp = ectxp - 1;
|
newctxp = ectxp - 1;
|
||||||
|
|
||||||
/* Checking if the new frame is within the sandbox else failure.*/
|
/* Checking if the new frame is within the sandbox else failure.*/
|
||||||
|
|
Loading…
Reference in New Issue