mirror of https://github.com/rusefi/ChibiOS.git
Added sandbox alarms API.
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@15634 27425a3e-05d8-49a3-a47f-9c15f0e5edd8
This commit is contained in:
parent
7c95ab1e9e
commit
3e910146e9
|
@ -45,6 +45,13 @@
|
|||
#define SB_CFG_ENABLE_VRQ TRUE
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Virtual IRQ to be used for alarm.
|
||||
*/
|
||||
#if !defined(SB_CFG_ALARM_VRQ) || defined(__DOXYGEN__)
|
||||
#define SB_CFG_ALARM_VRQ 0
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Enables Posix API in sandboxes using VFS.
|
||||
*/
|
||||
|
|
|
@ -45,6 +45,13 @@
|
|||
#define SB_CFG_ENABLE_VRQ TRUE
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Virtual IRQ to be used for alarm.
|
||||
*/
|
||||
#if !defined(SB_CFG_ALARM_VRQ) || defined(__DOXYGEN__)
|
||||
#define SB_CFG_ALARM_VRQ 0
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Enables Posix API in sandboxes using VFS.
|
||||
*/
|
||||
|
|
|
@ -45,6 +45,13 @@
|
|||
#define SB_CFG_ENABLE_VRQ TRUE
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Virtual IRQ to be used for alarm.
|
||||
*/
|
||||
#if !defined(SB_CFG_ALARM_VRQ) || defined(__DOXYGEN__)
|
||||
#define SB_CFG_ALARM_VRQ 0
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Enables Posix API in sandboxes using VFS.
|
||||
*/
|
||||
|
|
|
@ -45,6 +45,13 @@
|
|||
#define SB_CFG_ENABLE_VRQ TRUE
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Virtual IRQ to be used for alarm.
|
||||
*/
|
||||
#if !defined(SB_CFG_ALARM_VRQ) || defined(__DOXYGEN__)
|
||||
#define SB_CFG_ALARM_VRQ 0
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Enables Posix API in sandboxes using VFS.
|
||||
*/
|
||||
|
|
|
@ -49,6 +49,8 @@
|
|||
#define SB_SYSC_EVENT_WAIT_ALL 10
|
||||
#define SB_SYSC_EVENT_BROADCAST 11
|
||||
#define SB_SYSC_LOADELF 12
|
||||
#define SB_SYSC_VRQ_SET_ALARM 245
|
||||
#define SB_SYSC_VRQ_RESET_ALARM 246
|
||||
#define SB_SYSC_VRQ_WAIT 247
|
||||
#define SB_SYSC_VRQ_SETWT 248
|
||||
#define SB_SYSC_VRQ_CLRWT 249
|
||||
|
|
|
@ -100,6 +100,10 @@
|
|||
#error "SB_CFG_ENABLE_VRQ not defined in sbconf.h"
|
||||
#endif
|
||||
|
||||
#if !defined(SB_CFG_ALARM_VRQ) || defined(__DOXYGEN__)
|
||||
#error "SB_CFG_ALARM_VRQ not defined in sbconf.h"
|
||||
#endif
|
||||
|
||||
#if !defined(SB_CFG_ENABLE_VFS) || defined(__DOXYGEN__)
|
||||
#error "SB_CFG_ENABLE_VFS not defined in sbconf.h"
|
||||
#endif
|
||||
|
@ -152,6 +156,10 @@
|
|||
#error "SB_CFG_NUM_REGIONS not matching PORT_SWITCHED_REGIONS_NUMBER"
|
||||
#endif
|
||||
|
||||
#if (SB_CFG_ALARM_VRQ < 0) || (SB_CFG_ALARM_VRQ > 31)
|
||||
#error "invalid SB_CFG_ALARM_VRQ value"
|
||||
#endif
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Module data structures and types. */
|
||||
/*===========================================================================*/
|
||||
|
@ -255,6 +263,10 @@ typedef struct {
|
|||
* @brief Pointer to the image header.
|
||||
*/
|
||||
const sb_header_t *sbhp;
|
||||
/**
|
||||
* @brief Virtual timer used for alarms.
|
||||
*/
|
||||
virtual_timer_t alarm_vt;
|
||||
#if (CH_CFG_USE_MESSAGES == TRUE) || defined(__DOXYGEN__)
|
||||
/**
|
||||
* @brief Thread sending a message to the sandbox.
|
||||
|
|
|
@ -76,6 +76,8 @@ static void sb_api_loadelf(struct port_extctx *ectxp);
|
|||
* @{
|
||||
*/
|
||||
#if (SB_CFG_ENABLE_VRQ == TRUE) || defined(__DOXYGEN__)
|
||||
#define SB_SVC245_HANDLER sb_api_vrq_set_alarm
|
||||
#define SB_SVC246_HANDLER sb_api_vrq_reset_alarm
|
||||
#define SB_SVC247_HANDLER sb_api_vrq_wait
|
||||
#define SB_SVC248_HANDLER sb_api_vrq_setwt
|
||||
#define SB_SVC249_HANDLER sb_api_vrq_clrwt
|
||||
|
|
|
@ -101,6 +101,14 @@ static void vrq_privileged_code(void) {
|
|||
}
|
||||
}
|
||||
|
||||
static void delay_cb(virtual_timer_t *vtp, void *arg) {
|
||||
sb_class_t *sbp = (sb_class_t *)arg;
|
||||
|
||||
(void)vtp;
|
||||
|
||||
sbVRQTriggerFromISR(sbp, 1U << SB_CFG_ALARM_VRQ);
|
||||
}
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Module exported functions. */
|
||||
/*===========================================================================*/
|
||||
|
@ -235,6 +243,31 @@ void sbVRQTriggerFromISR(sb_class_t *sbp, sb_vrqmask_t vmask) {
|
|||
return;
|
||||
}
|
||||
|
||||
void sb_api_vrq_set_alarm(struct port_extctx *ectxp) {
|
||||
sb_class_t *sbp = (sb_class_t *)chThdGetSelfX()->ctx.syscall.p;
|
||||
sysinterval_t interval = (sysinterval_t )ectxp->r0;
|
||||
bool continuous = (bool)ectxp->r1;
|
||||
|
||||
if (continuous) {
|
||||
chVTSetContinuous(&sbp->alarm_vt, interval, delay_cb, (void *)sbp);
|
||||
}
|
||||
else {
|
||||
chVTSet(&sbp->alarm_vt, interval, delay_cb, (void *)sbp);
|
||||
}
|
||||
|
||||
ectxp->r0 = CH_RET_SUCCESS;
|
||||
}
|
||||
|
||||
void sb_api_vrq_reset_alarm(struct port_extctx *ectxp) {
|
||||
sb_class_t *sbp = (sb_class_t *)chThdGetSelfX()->ctx.syscall.p;
|
||||
|
||||
(void)ectxp;
|
||||
|
||||
chVTReset(&sbp->alarm_vt);
|
||||
|
||||
ectxp->r0 = CH_RET_SUCCESS;
|
||||
}
|
||||
|
||||
void sb_api_vrq_wait(struct port_extctx *ectxp) {
|
||||
sb_class_t *sbp = (sb_class_t *)chThdGetSelfX()->ctx.syscall.p;
|
||||
sb_vrqmask_t active_mask;
|
||||
|
@ -249,6 +282,8 @@ void sb_api_vrq_wait(struct port_extctx *ectxp) {
|
|||
}
|
||||
|
||||
chSysUnlock();
|
||||
|
||||
ectxp->r0 = CH_RET_SUCCESS;
|
||||
}
|
||||
|
||||
void sb_api_vrq_setwt(struct port_extctx *ectxp) {
|
||||
|
|
|
@ -66,6 +66,8 @@ extern "C" {
|
|||
#endif
|
||||
void sbVRQTriggerS(sb_class_t *sbp, sb_vrqmask_t vmask);
|
||||
void sbVRQTriggerFromISR(sb_class_t *sbp, sb_vrqmask_t vmask);
|
||||
void sb_api_vrq_set_alarm(struct port_extctx *ectxp);
|
||||
void sb_api_vrq_reset_alarm(struct port_extctx *ectxp);
|
||||
void sb_api_vrq_wait(struct port_extctx *ectxp);
|
||||
void sb_api_vrq_setwt(struct port_extctx *ectxp);
|
||||
void sb_api_vrq_clrwt(struct port_extctx *ectxp);
|
||||
|
|
Loading…
Reference in New Issue