本文整理汇总了C++中chSysLockFromIsr函数的典型用法代码示例。如果您正苦于以下问题:C++ chSysLockFromIsr函数的具体用法?C++ chSysLockFromIsr怎么用?C++ chSysLockFromIsr使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了chSysLockFromIsr函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: serve_interrupt
/**
* @brief Common IRQ handler.
*
* @param[in] sdp communication channel associated to the USART
*/
static void serve_interrupt(SerialDriver *sdp) {
USART_TypeDef *u = sdp->usart;
uint16_t cr1 = u->CR1;
uint16_t sr = u->SR; /* SR reset step 1.*/
uint16_t dr = u->DR; /* SR reset step 2.*/
/* Error condition detection.*/
if (sr & (USART_SR_ORE | USART_SR_NE | USART_SR_FE | USART_SR_PE))
set_error(sdp, sr);
/* Special case, LIN break detection.*/
if (sr & USART_SR_LBD) {
chSysLockFromIsr();
chnAddFlagsI(sdp, SD_BREAK_DETECTED);
chSysUnlockFromIsr();
u->SR &= ~USART_SR_LBD;
}
/* Data available.*/
if (sr & USART_SR_RXNE) {
chSysLockFromIsr();
sdIncomingDataI(sdp, (uint8_t)dr);
chSysUnlockFromIsr();
}
/* Transmission buffer empty.*/
if ((cr1 & USART_CR1_TXEIE) && (sr & USART_SR_TXE)) {
msg_t b;
chSysLockFromIsr();
b = chOQGetI(&sdp->oqueue);
if (b < Q_OK) {
chnAddFlagsI(sdp, CHN_OUTPUT_EMPTY);
u->CR1 = (cr1 & ~USART_CR1_TXEIE) | USART_CR1_TCIE;
}
else
u->DR = b;
chSysUnlockFromIsr();
}
/* Physical transmission end.*/
if (sr & USART_SR_TC) {
chSysLockFromIsr();
chnAddFlagsI(sdp, CHN_TRANSMISSION_END);
chSysUnlockFromIsr();
u->CR1 = cr1 & ~USART_CR1_TCIE;
u->SR &= ~USART_SR_TC;
}
}
示例2: _usb_ep0in
/**
* @brief Default EP0 IN callback.
* @details This function is used by the low level driver as default handler
* for EP0 IN events.
*
* @param[in] usbp pointer to the @p USBDriver object
* @param[in] ep endpoint number, always zero
*
* @notapi
*/
void _usb_ep0in(USBDriver *usbp, usbep_t ep) {
size_t max;
(void)ep;
switch (usbp->ep0state) {
case USB_EP0_TX:
max = usbFetchWord(&usbp->setup[6]);
/* If the transmitted size is less than the requested size and it is a
multiple of the maximum packet size then a zero size packet must be
transmitted.*/
if ((usbp->ep0n < max) && ((usbp->ep0n % usbp->epc[0]->in_maxsize) == 0)) {
usbPrepareTransmit(usbp, 0, NULL, 0);
chSysLockFromIsr();
usbStartTransmitI(usbp, 0);
chSysUnlockFromIsr();
usbp->ep0state = USB_EP0_WAITING_TX0;
return;
}
/* Falls into, it is intentional.*/
case USB_EP0_WAITING_TX0:
/* Transmit phase over, receiving the zero sized status packet.*/
usbp->ep0state = USB_EP0_WAITING_STS;
usbPrepareReceive(usbp, 0, NULL, 0);
chSysLockFromIsr();
usbStartReceiveI(usbp, 0);
chSysUnlockFromIsr();
return;
case USB_EP0_SENDING_STS:
/* Status packet sent, invoking the callback if defined.*/
if (usbp->ep0endcb != NULL)
usbp->ep0endcb(usbp);
usbp->ep0state = USB_EP0_WAITING_SETUP;
return;
default:
;
}
/* Error response, the state machine goes into an error state, the low
level layer will have to reset it to USB_EP0_WAITING_SETUP after
receiving a SETUP packet.*/
usb_lld_stall_in(usbp, 0);
usb_lld_stall_out(usbp, 0);
_usb_isr_invoke_event_cb(usbp, USB_EVENT_STALLED);
usbp->ep0state = USB_EP0_ERROR;
}
示例3: cmd_color
static void cmd_color(BaseSequentialStream *chp, int argc, char *argv[]) {
#define COLOR_USABLE_WITH_LOOP TRUE
#if !COLOR_USABLE_WITH_LOOP
uint32_t loop_times=1;
uint32_t loop_delay_ms=100;
if(argc > 0){
if(strcmp("-l", argv[0])==0){
if(argc > 1){
if(str_is_valid_num(argv[1])){
loop_times = atol(argv[1]);
if(argc > 2){
if(strcmp("-s", argv[2])==0){
if(argc > 3){
if(str_is_valid_num(argv[3])){
loop_delay_ms = atol(argv[3]);
} else {
chprintf(chp,invalid_num_str,argv[3]);
}
} else {
chprintf(chp,"please enter millisecond delay\n\r");
}
} else {
chprintf(chp,invalid_arg_str,argv[2]);
}
}
} else {
chprintf(chp,invalid_num_str, argv[1]);
}
} else {
chprintf(chp, "please enter a number of times to loop\n\r");
}
} else if(strcmp("-h",argv[0])==0){
chprintf(chp, "printing help:\n\r");
chprintf(chp, color_usage);
} else {
chprintf(chp, invalid_arg_str, argv[0]);
chprintf(chp, color_usage);
}
}
chprintf(chp, "looping %U times with delay of %U milliseconds:\n\r",
loop_times,loop_delay_ms);
while(loop_times--){
#endif
#if !USE_I2C_POLL_THD
request_color_data();
#endif
chSysLockFromIsr();
get_lx_from_cnts();
chSysUnlockFromIsr();
chprintf(chp, "color_lx: y=%U\tr=%U\tg=%U\tb=%U\n\r",
y_lx_val,r_lx_val,g_lx_val,b_lx_val);
#if !COLOR_USABLE_WITH_LOOP
chThdSleepMilliseconds(loop_delay_ms);
}
#endif
}
示例4: can_lld_wakeup_handler
/**
* @brief Wake up ISR handler.
*
* @param[in] canp pointer to the @p CANDriver object
*
* @notapi
*/
static void can_lld_wakeup_handler(CANDriver *canp) {
/* Wakeup event.*/
canp->state = CAN_READY;
can_lld_wakeup(canp);
chSysLockFromIsr();
chEvtBroadcastI(&canp->wakeup_event);
chSysUnlockFromIsr();
}
示例5: gpt1cb
/*
* GPT1 callback.
*/
static void gpt1cb(GPTDriver *gptp) {
msg_t msg;
(void)gptp;
chSysLockFromIsr();
msg = chMBPostI(&mb[0], MSG_SEND_RIGHT);
if (msg != RDY_OK)
saturated = TRUE;
chSysUnlockFromIsr();
}
示例6: pwm3cb
static void pwm3cb(PWMDriver *pwmp) {
chSysLockFromIsr();
if (pwm_cycles > 8) {
pwmDisableChannelI(pwmp, 2);
pwmDisableChannelI(pwmp, 3);
tmp1 = (&GPT_DRIVER)->tim->CNT;
}
chSysUnlockFromIsr();
}
示例7: i2cDmaIrqHandler
// =============================== I2C =========================================
void i2cDmaIrqHandler(void *p, uint32_t flags) {
chSysLockFromIsr();
//Uart.Printf("===T===");
Thread *PThd = ((i2c_t*)p)->PRequestingThread;
if (PThd != NULL) {
((i2c_t*)p)->PRequestingThread = NULL;
chSchReadyI(PThd);
}
chSysUnlockFromIsr();
}
示例8: extdetail_launch_detect
/*! Triggered when the pin changes state (both edges)
*
* Challenge: Add de-bouncing
*/
void extdetail_launch_detect(EXTDriver *extp, expchannel_t channel) {
(void)extp;
(void)channel;
chSysLockFromIsr();
chEvtBroadcastI(&extdetail_launch_detect_event);
chSysUnlockFromIsr();
}
示例9: TIM2_IRQHandler
void TIM2_IRQHandler(void) {
CH_IRQ_PROLOGUE();
chSysLockFromIsr();
if(TIM2->SR & TIM_SR_UIF) {
TIM2->SR &= ~TIM_SR_UIF;
Adc.IIrqSmpHandler();
}
chSysUnlockFromIsr();
CH_IRQ_EPILOGUE();
}
示例10: AdcTxIrq
void AdcTxIrq(void *p, uint32_t flags) {
dmaStreamDisable(ADC_DMA);
ADC1->CR2 = 0; // Disable ADC
// Signal event to thread
if(IPThread != nullptr) {
chSysLockFromIsr();
chEvtSignalI(IPThread, IEvt);
chSysUnlockFromIsr();
}
}
示例11: systimer_serve_interrupt
/**
* @brief Process system timer interrupts, if present.
*
* @notapi
*/
static void systimer_serve_interrupt( void )
{
// Update the system time
chSysLockFromIsr();
chSysTimerHandlerI();
chSysUnlockFromIsr();
// Clear timer interrupt
ARM_TIMER_CLI = 0;
}
示例12: gpt2cb
/*
* GPT2 callback.
*/
static void gpt2cb(GPTDriver *gptp) {
msg_t msg;
(void)gptp;
chSysLockFromIsr();
msg = chMBPostI(&mb[NUM_THREADS - 1], MSG_SEND_LEFT);
if (msg != RDY_OK)
saturated = TRUE;
chSysUnlockFromIsr();
}
示例13: AdcTxIrq
void AdcTxIrq(void *p, uint32_t flags) {
dmaStreamDisable(ADC_DMA);
// Resume thread if any
chSysLockFromIsr();
if(PAdcThread != NULL) {
if(PAdcThread->p_state == THD_STATE_SUSPENDED) chSchReadyI(PAdcThread);
PAdcThread = NULL;
}
chSysUnlockFromIsr();
}
示例14: txend2
/*
* This callback is invoked when a transmission has physically completed.
*/
static void txend2(UARTDriver *uartp) {
(void)uartp;
palSetPad(IOPORT3, GPIOC_LED);
chSysLockFromIsr();
if (chVTIsArmedI(&vt1))
chVTResetI(&vt1);
chVTSetI(&vt1, MS2ST(5000), restart, NULL);
chSysUnlockFromIsr();
}
示例15: extcb1
/* Triggered when the button is pressed or released. The LED is set to ON.*/
static void extcb1(EXTDriver *extp, expchannel_t channel) {
(void)extp;
(void)channel;
palClearPad(GPIOC, GPIOC_LED);
chSysLockFromIsr();
if (!chVTIsArmedI(&vt))
chVTSetI(&vt, MS2ST(200), ledoff, NULL);
chSysUnlockFromIsr();
}