Changeset 195


Ignore:
Timestamp:
Mar 30, 2016, 4:57:34 PM (8 years ago)
Author:
ertl-honda
Message:

R2CAでの排他制御のサポート

File:
1 edited

Legend:

Unmodified
Added
Removed
  • rtos_arduino/trunk/arduino_lib/libraries/NcesCan/mcp_can.cpp

    r136 r195  
    2222*/
    2323#include "mcp_can.h"
     24
     25#ifdef TOPPERS_WITH_ARDUINO
     26#include "rca.h"
     27#define ENTER_CRITICAL wai_sem(SPI_SEM);
     28#define LEAVE_CRITICAL sig_sem(SPI_SEM);
     29#else /* !TOPPERS_WITH_ARDUINO */
     30#define WAIT_TIMEOUT
     31#define ENTER_CRITICAL
     32#define LEAVE_CRITICAL
     33#endif /* TOPPERS_WITH_ARDUINO */
    2434
    2535#define spi_readwrite SPI.transfer
     
    553563{
    554564    INT8U res;
    555 
     565   
     566    ENTER_CRITICAL
    556567    SPI.begin();
    557568    res = mcp2515_init(speedset);
     569    LEAVE_CRITICAL
     570     
    558571    if (res == MCP2515_OK) return CAN_OK;
    559572    else return CAN_FAILINIT;
     
    566579INT8U MCP_CAN::enableInterrupt(INT8U mask)
    567580{
     581    ENTER_CRITICAL
    568582    mcp2515_modifyRegister(MCP_CANINTE, mask, mask);
     583    LEAVE_CRITICAL
     584     
    569585    return CAN_OK;
    570586}
     
    576592INT8U MCP_CAN::disableInterrupt(INT8U mask)
    577593{
     594    ENTER_CRITICAL
    578595    mcp2515_modifyRegister(MCP_CANINTE, mask, !mask);
     596    LEAVE_CRITICAL
     597     
    579598    return CAN_OK;   
    580599}
     
    597616{
    598617    INT8U res = MCP2515_OK;
     618   
     619    ENTER_CRITICAL;
    599620#if DEBUG_MODE
    600621    Serial.print("Begin to set Mask!!\r\n");
     
    605626    Serial.print("Enter setting mode fall\r\n");
    606627#endif
     628    LEAVE_CRITICAL;
    607629    return res;
    608630    }
     
    621643    Serial.print("Enter normal mode fall\r\n");
    622644#endif
     645    LEAVE_CRITICAL;       
    623646    return res;
    624647  }
     
    626649    Serial.print("set Mask success!!\r\n");
    627650#endif
     651    LEAVE_CRITICAL;
    628652    return res;
    629653}
     
    636660{
    637661    INT8U res = MCP2515_OK;
     662
     663    ENTER_CRITICAL;   
    638664#if DEBUG_MODE
    639665    Serial.print("Begin to set Filter!!\r\n");
     
    645671      Serial.print("Enter setting mode fall\r\n");
    646672#endif
     673      LEAVE_CRITICAL;
    647674      return res;
    648675    }
     
    686713      delay(10);
    687714#endif
     715      LEAVE_CRITICAL;       
    688716      return res;
    689717    }
     
    693721    delay(10);
    694722#endif
    695    
     723    LEAVE_CRITICAL;
    696724    return res;
    697725}
     
    705733    CHECK_RXBID(rxbid);
    706734
     735    ENTER_CRITICAL;
    707736#if (DEBUG_RXANY==1)
    708737                                                                        /* enable both receive-buffers  */
     
    732761    }
    733762#endif
    734 
     763    LEAVE_CRITICAL;
     764   
    735765    return CAN_OK;
    736766}
     
    748778    CHECK_TXBID(txbid);
    749779   
     780    ENTER_CRITICAL;
    750781    mcp2515_write_canMsg(txbid, id, len, p_buf, ext, rtr);
    751782    mcp2515_modifyRegister(MCP_CANINTF, intf_bit, 0);
    752783    mcp2515_start_transmit( txbid );
    753 
     784    LEAVE_CRITICAL;
    754785    return CAN_OK;
    755786}
     
    784815    INT8U stat_bit = (rxbid == 0)? MCP_STAT_RX0IF : MCP_STAT_RX1IF;
    785816    INT8U intf_bit = (rxbid == 0)? MCP_RX0IF : MCP_RX1IF;
    786      
     817   
     818    ENTER_CRITICAL;     
    787819    stat = mcp2515_readStatus();
    788820
     
    796828        res = CAN_NOMSG;
    797829    }
     830    LEAVE_CRITICAL;   
    798831    return res;
    799832}
     
    841874INT8U MCP_CAN::checkReceive(INT8U rxbid)
    842875{
    843     INT8U res;
     876    INT8U res = CAN_NOMSG;
    844877    CHECK_RXBID(rxbid);
     878   
     879    ENTER_CRITICAL;
    845880    res = mcp2515_readStatus();                                         /* RXnIF in Bit 1 and 0         */
    846881    if (rxbid == 0) {
    847882        if ( (res & MCP_STAT_RX0IF) == MCP_STAT_RX0IF) {
    848             return CAN_MSGAVAIL;
     883            res = CAN_MSGAVAIL;
    849884        }
    850885    }
    851886    else if (rxbid == 1) {
    852887        if ( (res & MCP_STAT_RX1IF) == MCP_STAT_RX1IF ) {
    853             return CAN_MSGAVAIL;
     888            res = CAN_MSGAVAIL;
    854889        }       
    855890    }
    856     return CAN_NOMSG;
     891    LEAVE_CRITICAL;
     892   
     893    return res;
    857894}
    858895
     
    863900INT8U MCP_CAN::checkSend(INT8U txbid)
    864901{
    865     INT8U res;
     902    INT8U res = CAN_NOSENDWAIT;
    866903    INT8U txbx_ctrl[MCP_N_TXBUFFERS] = { MCP_TXB0CTRL, MCP_TXB1CTRL, MCP_TXB2CTRL };
    867904   
    868905    CHECK_TXBID(txbid);
    869906   
     907    ENTER_CRITICAL;   
    870908    res = mcp2515_readRegister(txbx_ctrl[txbid]);
    871909
    872910    if ( (res & MCP_TXB_TXREQ_M) == MCP_TXB_TXREQ_M) {
    873         return CAN_SENDWAIT;
    874     }
    875 
     911        res = CAN_SENDWAIT;
     912    }
     913    LEAVE_CRITICAL;
     914   
    876915    return CAN_NOSENDWAIT;
    877916}
     
    883922INT8U MCP_CAN::checkError(void)
    884923{
     924    INT8U res = CAN_OK;
     925   
     926    ENTER_CRITICAL;       
    885927    INT8U eflg = mcp2515_readRegister(MCP_EFLG);
    886928
    887929    if ( eflg & MCP_EFLG_ERRORMASK )
    888930    {
    889         return CAN_CTRLERROR;
    890     }
    891     else
    892     {
    893         return CAN_OK;
    894     }
     931        res = CAN_CTRLERROR;
     932    }
     933    LEAVE_CRITICAL;
     934
     935    return res;
    895936}
    896937
Note: See TracChangeset for help on using the changeset viewer.