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
|
#define SB_CFG_ENABLE_VRQ TRUE
|
||||||
#endif
|
#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.
|
* @brief Enables Posix API in sandboxes using VFS.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -45,6 +45,13 @@
|
||||||
#define SB_CFG_ENABLE_VRQ TRUE
|
#define SB_CFG_ENABLE_VRQ TRUE
|
||||||
#endif
|
#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.
|
* @brief Enables Posix API in sandboxes using VFS.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -45,6 +45,13 @@
|
||||||
#define SB_CFG_ENABLE_VRQ TRUE
|
#define SB_CFG_ENABLE_VRQ TRUE
|
||||||
#endif
|
#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.
|
* @brief Enables Posix API in sandboxes using VFS.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -45,6 +45,13 @@
|
||||||
#define SB_CFG_ENABLE_VRQ TRUE
|
#define SB_CFG_ENABLE_VRQ TRUE
|
||||||
#endif
|
#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.
|
* @brief Enables Posix API in sandboxes using VFS.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -49,6 +49,8 @@
|
||||||
#define SB_SYSC_EVENT_WAIT_ALL 10
|
#define SB_SYSC_EVENT_WAIT_ALL 10
|
||||||
#define SB_SYSC_EVENT_BROADCAST 11
|
#define SB_SYSC_EVENT_BROADCAST 11
|
||||||
#define SB_SYSC_LOADELF 12
|
#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_WAIT 247
|
||||||
#define SB_SYSC_VRQ_SETWT 248
|
#define SB_SYSC_VRQ_SETWT 248
|
||||||
#define SB_SYSC_VRQ_CLRWT 249
|
#define SB_SYSC_VRQ_CLRWT 249
|
||||||
|
|
|
@ -100,6 +100,10 @@
|
||||||
#error "SB_CFG_ENABLE_VRQ not defined in sbconf.h"
|
#error "SB_CFG_ENABLE_VRQ not defined in sbconf.h"
|
||||||
#endif
|
#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__)
|
#if !defined(SB_CFG_ENABLE_VFS) || defined(__DOXYGEN__)
|
||||||
#error "SB_CFG_ENABLE_VFS not defined in sbconf.h"
|
#error "SB_CFG_ENABLE_VFS not defined in sbconf.h"
|
||||||
#endif
|
#endif
|
||||||
|
@ -152,6 +156,10 @@
|
||||||
#error "SB_CFG_NUM_REGIONS not matching PORT_SWITCHED_REGIONS_NUMBER"
|
#error "SB_CFG_NUM_REGIONS not matching PORT_SWITCHED_REGIONS_NUMBER"
|
||||||
#endif
|
#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. */
|
/* Module data structures and types. */
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
|
@ -255,6 +263,10 @@ typedef struct {
|
||||||
* @brief Pointer to the image header.
|
* @brief Pointer to the image header.
|
||||||
*/
|
*/
|
||||||
const sb_header_t *sbhp;
|
const sb_header_t *sbhp;
|
||||||
|
/**
|
||||||
|
* @brief Virtual timer used for alarms.
|
||||||
|
*/
|
||||||
|
virtual_timer_t alarm_vt;
|
||||||
#if (CH_CFG_USE_MESSAGES == TRUE) || defined(__DOXYGEN__)
|
#if (CH_CFG_USE_MESSAGES == TRUE) || defined(__DOXYGEN__)
|
||||||
/**
|
/**
|
||||||
* @brief Thread sending a message to the sandbox.
|
* @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__)
|
#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_SVC247_HANDLER sb_api_vrq_wait
|
||||||
#define SB_SVC248_HANDLER sb_api_vrq_setwt
|
#define SB_SVC248_HANDLER sb_api_vrq_setwt
|
||||||
#define SB_SVC249_HANDLER sb_api_vrq_clrwt
|
#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. */
|
/* Module exported functions. */
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
|
@ -235,6 +243,31 @@ void sbVRQTriggerFromISR(sb_class_t *sbp, sb_vrqmask_t vmask) {
|
||||||
return;
|
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) {
|
void sb_api_vrq_wait(struct port_extctx *ectxp) {
|
||||||
sb_class_t *sbp = (sb_class_t *)chThdGetSelfX()->ctx.syscall.p;
|
sb_class_t *sbp = (sb_class_t *)chThdGetSelfX()->ctx.syscall.p;
|
||||||
sb_vrqmask_t active_mask;
|
sb_vrqmask_t active_mask;
|
||||||
|
@ -249,6 +282,8 @@ void sb_api_vrq_wait(struct port_extctx *ectxp) {
|
||||||
}
|
}
|
||||||
|
|
||||||
chSysUnlock();
|
chSysUnlock();
|
||||||
|
|
||||||
|
ectxp->r0 = CH_RET_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
void sb_api_vrq_setwt(struct port_extctx *ectxp) {
|
void sb_api_vrq_setwt(struct port_extctx *ectxp) {
|
||||||
|
|
|
@ -66,6 +66,8 @@ extern "C" {
|
||||||
#endif
|
#endif
|
||||||
void sbVRQTriggerS(sb_class_t *sbp, sb_vrqmask_t vmask);
|
void sbVRQTriggerS(sb_class_t *sbp, sb_vrqmask_t vmask);
|
||||||
void sbVRQTriggerFromISR(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_wait(struct port_extctx *ectxp);
|
||||||
void sb_api_vrq_setwt(struct port_extctx *ectxp);
|
void sb_api_vrq_setwt(struct port_extctx *ectxp);
|
||||||
void sb_api_vrq_clrwt(struct port_extctx *ectxp);
|
void sb_api_vrq_clrwt(struct port_extctx *ectxp);
|
||||||
|
|
Loading…
Reference in New Issue