From 8cf628e780b9a70174d343e1107853188aeddf89 Mon Sep 17 00:00:00 2001 From: bugobliterator Date: Tue, 8 Jul 2014 08:51:26 +0530 Subject: [PATCH] HAL_Linux_RCoutput:Add handler to catch SIGBUS error --- libraries/AP_HAL_Linux/RCOutput.cpp | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/libraries/AP_HAL_Linux/RCOutput.cpp b/libraries/AP_HAL_Linux/RCOutput.cpp index 27d5fbd00f..b3e43539d3 100644 --- a/libraries/AP_HAL_Linux/RCOutput.cpp +++ b/libraries/AP_HAL_Linux/RCOutput.cpp @@ -15,6 +15,7 @@ #include #include #include +#include using namespace Linux; @@ -24,10 +25,14 @@ static const uint8_t chan_pru_map[]= {10,8,11,9,7,6,5,4,3,2,1,0}; static const uint8_t pru_chan_map[]= {11,10,9,8,7,6,5,4,1,3,0,2}; //pru_chan_map[PRU_REG_R30/31_NUM] = CHANNEL_NUM; static const AP_HAL::HAL& hal = AP_HAL_BOARD_DRIVER; - +static void catch_sigbus(int sig) +{ + hal.scheduler->panic("RCOutput.cpp:SIGBUS error gernerated\n"); +} void LinuxRCOutput::init(void* machtnicht) { uint32_t mem_fd; + signal(SIGBUS,catch_sigbus); mem_fd = open("/dev/mem", O_RDWR|O_SYNC); sharedMem_cmd = (struct pwm_cmd *) mmap(0, 0x1000, PROT_READ|PROT_WRITE, MAP_SHARED, mem_fd, PRUSS_SHAREDRAM_BASE); close(mem_fd); @@ -35,7 +40,7 @@ void LinuxRCOutput::init(void* machtnicht) void LinuxRCOutput::set_freq(uint32_t chmask, uint16_t freq_hz) //LSB corresponds to CHAN_1 { - int i; + uint8_t i; unsigned long tick=TICK_PER_S/(unsigned long)freq_hz; for(i=0;i<12;i++){ if(chmask&(1<enmask |= 1<enmask |= 1U<enmask &= !(1<enmask &= !(1U<PWM_CHAN_COUNT){ + len = PWM_CHAN_COUNT; + } for(i=0;iPWM_CHAN_COUNT){ + len = PWM_CHAN_COUNT; + } for(i=0;ihilo_read[chan_pru_map[i]][1]/TICK_PER_US; }