📄 hcanapif.a51
字号:
$NOXREF
$SYMBOLS
$DEBUG
$NORB
$NOGEN
$PAGELENGTH(80) PAGEWIDTH(110)
;************************************************************************
;************************************************************************
;* *
;* C A N A P P L I C A T I O N I N T E R F A C E *
;* *
;************************************************************************
;************************************************************************
;* *
;* Funktion: *
;* *
;* Diese Modul bildet die registerbankunabh刵gige Schnittstelle *
;* zwischen der Applikation und dem CAN-Treiber. *
;* Im Prinzip implementiert dieses Modul einen Echtzeit-Monitor *
;* zur Sicherstellung, dass immer nur ein Applikationstask den *
;* CAN-Treiber zur gleichen Zeit benutzen kann. *
;* Ein Teil dieses Moduls ist reentrant implementiert, so dass *
;* mehrere Tasks quasi gleichzeitig versuchen k攏nen eine *
;* CAN-Funktion aufzurufen. *
;* *
;* Der Hauptzweck dieses moduls ist die Entlastung des *
;* Applikationsprogrammierers von Echtzeitproblemen. *
;* *
;* Das Modul erwartet von der Applikation eine Parameter乥ergabe *
;* nach C-51 Konventionen. *
;* *
;* Aus Uebersichtlichkeitsgr乶den ist das Modul auf mehrere *
;* Include-Files aufgeteilt *
;* *
;* *
;* Eine Detailbeschreibung zu diesem Modul findet sich im Dokument *
;* =============================================================== *
;* SW-Design Basic-CAN (BCANDES.WPD) *
;* ================================== *
;* *
;* *
;* Filename : HCANAPIF.A51 *
;* *
;* Modulname : HCANAPIF *
;* *
;* Zielsystem : Jedes 8051 System mit einem Siemens *
;* 81C91 CAN-Controller *
;* *
;* Entwicklungssystem : Keil ASM-51 *
;* *
;************************************************************************
;* Versionen: *
;* *
;* 0.1 31.10.1990 Th. Fischler: - Erste Version *
;* 1.0 6.12.1990 Th. Fischler: - CAN_TASK_START wird zu *
;* CAN_TASK_CREATE *
;* - Neue Funktion CAN_GET_STATUS *
;* 2.0 10.10.1991 Th. Fischler: - Anpassung an RTX-51 V4.0 *
;* 2.1 21.03.1996 K. Birsen: - ORDER_BUF_PARAM vom 5 auf 6 *
;* erh攈t *
;************************************************************************
;* Copyright 1991 .. 2001 METTLER & FUCHS AG, CH-8953 Dietikon *
;************************************************************************
NAME HCANAPIF
;------------------------------------------------------------------------
; I M P O R T S
;------------------------------------------------------------------------
; RTX-51 V4.0 System-Calls
EXTRN CODE (_os_wait, _os_clear_signal, _os_send_signal, _os_create_task)
EXTRN CODE (os_running_task_id)
EXTRN CODE (can_can_task_main) ; Dummy include, nur vorhanden, um
; den BL51 zum Einbinden des
; CAN-Task zu zwingen.
$EJECT
;------------------------------------------------------------------------
; E X P O R T S
;------------------------------------------------------------------------
; XDATA-Variablen
PUBLIC C_ORDER_BUF
; Prozeduren + Parameter
PUBLIC can_task_create
PUBLIC _can_hw_init, ?_can_hw_init?BYTE
PUBLIC _can_def_obj
PUBLIC can_stop, can_start
PUBLIC _can_send
PUBLIC _can_write
PUBLIC _can_receive
PUBLIC _can_bind_obj
PUBLIC _can_unbind_obj
PUBLIC _can_wait
PUBLIC _can_request
PUBLIC _can_read
PUBLIC can_get_status
$EJECT
;------------------------------------------------------------------------
; D E F I N I T I O N E N
;------------------------------------------------------------------------
; M A C R O S
$INCLUDE(CANAPIF.MAC)
; CAN Funktionsreturn-Werte
$INCLUDE(CANCONST.DCL)
TRUE EQU 1
FALSE EQU 0
; RTX-51 V4.0 Event-Selectoren
K_MBX EQU 10H
K_INT EQU 20H
K_SIG EQU 40H
K_TMO EQU 80H
; RTX-51 Wait-Returnwerte
MSG_EVENT EQU 1
INT_EVENT EQU 2
SIG_EVENT EQU 3
TMO_EVENT EQU 4
; Befehle an den CAN-Task
CAN_HW_INIT_ORDER EQU 1
CAN_DEF_OBJ_ORDER EQU 2
CAN_STOP_ORDER EQU 3
CAN_START_ORDER EQU 4
CAN_SEND_ORDER EQU 5
CAN_REQUEST_ORDER EQU 6
CAN_BIND_OBJ_ORDER EQU 7
CAN_UNBIND_OBJ_ORDER EQU 8
CAN_WRITE_ORDER EQU 9
CAN_READ_W_IND_ORDER EQU 10
CAN_READ_W_TID_ORDER EQU 11
CAN_READ_ORDER EQU 12
CAN_GET_STATUS_ORDER EQU 13
CAN_ACTIVATE_WAIT_ORDER EQU 14
; Tasknummer des CAN-Task
C_DRIVER_ID EQU 0 ; muss gleich der in CANDRV
; verwendeten Nummer sein !
;------------------------------------------------------------------------
; G L O B A L E X D A T A - V A R I A B L E N
;------------------------------------------------------------------------
?XD?HCANAPIF SEGMENT XDATA INPAGE
RSEG ?XD?HCANAPIF
; Die Applikation erteilt dem CAN-Driver 乥er den gemeinsamen Speicher-
; bereich C_ORDER_BUF Befehle. Ueber diesen gemeinsamen Speicherbereich
; gibt der CAN-Driver ebenfalls Status-Meldungen an die Applikation
; zur乧k.
; Das Modul CANDRV importiert diese Variable
; Die Definitionen sollen der folgenden Hochsprachen-Struktur
; entsprechen :
; C_ORDER_BUF : RECORD
; ORDER : BYTE; (* Befehl von der Applikation an CAN *)
; TASK_ID : BYTE; (* ID der Applikation *)
; PARAM : ARRAY [0..5] OF BYTE; (* Datenfeld *)
; END;
;
; VORSICHT !! : Die Reihenfolge und Gr攕se der einzelnen Elemente darf nicht
; ge刵dert werden (C-Code des CAN-Task nimmt diese Reihenfolge
; an)
C_ORDER_BUF:
C_ORDER_BUF_ORDER: DS 1
C_ORDER_BUF_ID: DS 1
C_ORDER_BUF_PARAM: DS 6
; Falls ein Task den CAN-Treiber benutzen m攃hte, er aber bereits besetzt
; ist (C_DRIVER_IN_USE = TRUE), muss der aufrufende Task seine Parameter
; abspeichern bevor er sich schlafenlegt. Dazu kann er sich einen
; unbenutzten Bereich in C_TEMP_BUF suchen und seine Task-ID und die
; Parameter darin abspeichern.
; Jeder Task der den CAN-Treiber verl剆st, untersucht den C_TEMP_BUF
; ob ein Task aufgeweckt werden soll.
;
; Die Definitionen sollen der folgenden Hochsprachen-Struktur
; entsprechen :
; C_TEMP_BUF : ARRAY [0..2] OF RECORD
; OCCUPIED : BOOLEAN;
; TASK_ID : BYTE;
; DATA : ARRAY [0..5] OF BYTE;
; END;
C_TEMP_BUF_0_OCC: DS 1
C_TEMP_BUF_0_ID: DS 1
C_TEMP_BUF_0_DATA: DS 6
C_TEMP_BUF_1_OCC: DS 1
C_TEMP_BUF_1_ID: DS 1
C_TEMP_BUF_1_DATA: DS 6
C_TEMP_BUF_2_OCC: DS 1
C_TEMP_BUF_2_ID: DS 1
C_TEMP_BUF_2_DATA: DS 6
;------------------------------------------------------------------------
; G L O B A L E B I T - V A R I A B L E N
;------------------------------------------------------------------------
?BI?HCANAPIF SEGMENT BIT
RSEG ?BI?HCANAPIF
; Da die CAN-Treiber Funktionen nicht reentrant sind, darf immer nur ein
; Task die Funktionen des CAN-Treibers benutzen. Die Schnittstelle muss
; dieses Verhalten sicherstellen.
; Dazu wird das Flag C_DRIVER_IN_USE definiert. Jeder aufrufende Task
; testet mit diesem Flag ob er den CAN-Treiber benutzen darf. Falls der
; CAN-Treiber besetzt ist, legt sich der aufrufende Task schlafen und wird
; danach vom Task der den CAN-Treiber verl剆st wieder aufgeweckt.
;
; C_DRIVER_IN_USE = 1 --> CAN-Treiber besetzt
; C_DRIVER_IN_USE = 0 --> CAN-Treiber frei
C_DRIVER_IN_USE: DBIT 1
$EJECT
;------------------------------------------------------------------------
; L O K A L E P R O Z E D U R E N
;------------------------------------------------------------------------
$INCLUDE(HCANAP_1.INC)
$EJECT
;------------------------------------------------------------------------
; G L O B A L E P R O Z E D U R E N
;------------------------------------------------------------------------
$INCLUDE(HCANAP_2.INC)
END
;------------------------------------------------------------------------
; END OF MODULE HCANAPIF
;------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -