targets/LPC/plc_LPC_main.c
author edouard
Tue, 22 Feb 2011 14:11:50 +0100
changeset 577 04baf6607a44
parent 521 02cb9e5fb6f6
child 579 554ba6df4ee0
permissions -rwxr-xr-x
LPC : Completed initial debug support
425
f390e9fdd2cf Add new target (Makefile)
greg
parents:
diff changeset
     1
/**
f390e9fdd2cf Add new target (Makefile)
greg
parents:
diff changeset
     2
 * Yagarto specific code
f390e9fdd2cf Add new target (Makefile)
greg
parents:
diff changeset
     3
 **/
f390e9fdd2cf Add new target (Makefile)
greg
parents:
diff changeset
     4
518
8e61b0066859 Fixed confusion about __common_ticktime type, redesigned LPC PLC timer support
edouard
parents: 502
diff changeset
     5
#include <app_glue.h>
425
f390e9fdd2cf Add new target (Makefile)
greg
parents:
diff changeset
     6
f390e9fdd2cf Add new target (Makefile)
greg
parents:
diff changeset
     7
/* provided by POUS.C */
518
8e61b0066859 Fixed confusion about __common_ticktime type, redesigned LPC PLC timer support
edouard
parents: 502
diff changeset
     8
extern unsigned long long common_ticktime__;
577
04baf6607a44 LPC : Completed initial debug support
edouard
parents: 521
diff changeset
     9
extern unsigned long __tick;
04baf6607a44 LPC : Completed initial debug support
edouard
parents: 521
diff changeset
    10
04baf6607a44 LPC : Completed initial debug support
edouard
parents: 521
diff changeset
    11
static int debug_locked = 0;
04baf6607a44 LPC : Completed initial debug support
edouard
parents: 521
diff changeset
    12
static int _DebugDataAvailable = 0;
04baf6607a44 LPC : Completed initial debug support
edouard
parents: 521
diff changeset
    13
static unsigned long __debug_tick;
04baf6607a44 LPC : Completed initial debug support
edouard
parents: 521
diff changeset
    14
518
8e61b0066859 Fixed confusion about __common_ticktime type, redesigned LPC PLC timer support
edouard
parents: 502
diff changeset
    15
void LPC_GetTime(IEC_TIME*);
8e61b0066859 Fixed confusion about __common_ticktime type, redesigned LPC PLC timer support
edouard
parents: 502
diff changeset
    16
void LPC_SetTimer(unsigned long long next, unsigned long long period);
425
f390e9fdd2cf Add new target (Makefile)
greg
parents:
diff changeset
    17
f390e9fdd2cf Add new target (Makefile)
greg
parents:
diff changeset
    18
long AtomicCompareExchange(long* atomicvar,long compared, long exchange)
f390e9fdd2cf Add new target (Makefile)
greg
parents:
diff changeset
    19
{
518
8e61b0066859 Fixed confusion about __common_ticktime type, redesigned LPC PLC timer support
edouard
parents: 502
diff changeset
    20
	/* No need for real atomic op on LPC,
8e61b0066859 Fixed confusion about __common_ticktime type, redesigned LPC PLC timer support
edouard
parents: 502
diff changeset
    21
	 * no possible preemption between debug and PLC */
8e61b0066859 Fixed confusion about __common_ticktime type, redesigned LPC PLC timer support
edouard
parents: 502
diff changeset
    22
	long res = *atomicvar;
8e61b0066859 Fixed confusion about __common_ticktime type, redesigned LPC PLC timer support
edouard
parents: 502
diff changeset
    23
	if(res == compared){
8e61b0066859 Fixed confusion about __common_ticktime type, redesigned LPC PLC timer support
edouard
parents: 502
diff changeset
    24
		*atomicvar = exchange;
8e61b0066859 Fixed confusion about __common_ticktime type, redesigned LPC PLC timer support
edouard
parents: 502
diff changeset
    25
	}
8e61b0066859 Fixed confusion about __common_ticktime type, redesigned LPC PLC timer support
edouard
parents: 502
diff changeset
    26
	return res;
425
f390e9fdd2cf Add new target (Makefile)
greg
parents:
diff changeset
    27
}
f390e9fdd2cf Add new target (Makefile)
greg
parents:
diff changeset
    28
f390e9fdd2cf Add new target (Makefile)
greg
parents:
diff changeset
    29
void PLC_GetTime(IEC_TIME *CURRENT_TIME)
f390e9fdd2cf Add new target (Makefile)
greg
parents:
diff changeset
    30
{
f390e9fdd2cf Add new target (Makefile)
greg
parents:
diff changeset
    31
	/* Call target GetTime function */
518
8e61b0066859 Fixed confusion about __common_ticktime type, redesigned LPC PLC timer support
edouard
parents: 502
diff changeset
    32
	LPC_GetTime(CURRENT_TIME);
425
f390e9fdd2cf Add new target (Makefile)
greg
parents:
diff changeset
    33
}
f390e9fdd2cf Add new target (Makefile)
greg
parents:
diff changeset
    34
518
8e61b0066859 Fixed confusion about __common_ticktime type, redesigned LPC PLC timer support
edouard
parents: 502
diff changeset
    35
void PLC_SetTimer(unsigned long long next, unsigned long long period)
425
f390e9fdd2cf Add new target (Makefile)
greg
parents:
diff changeset
    36
{
518
8e61b0066859 Fixed confusion about __common_ticktime type, redesigned LPC PLC timer support
edouard
parents: 502
diff changeset
    37
	LPC_SetTimer(next, period);
425
f390e9fdd2cf Add new target (Makefile)
greg
parents:
diff changeset
    38
}
f390e9fdd2cf Add new target (Makefile)
greg
parents:
diff changeset
    39
f390e9fdd2cf Add new target (Makefile)
greg
parents:
diff changeset
    40
int startPLC(int argc,char **argv)
f390e9fdd2cf Add new target (Makefile)
greg
parents:
diff changeset
    41
{
518
8e61b0066859 Fixed confusion about __common_ticktime type, redesigned LPC PLC timer support
edouard
parents: 502
diff changeset
    42
	if(__init(argc,argv) == 0){
8e61b0066859 Fixed confusion about __common_ticktime type, redesigned LPC PLC timer support
edouard
parents: 502
diff changeset
    43
		PLC_SetTimer(0, common_ticktime__);
425
f390e9fdd2cf Add new target (Makefile)
greg
parents:
diff changeset
    44
		return 0;
518
8e61b0066859 Fixed confusion about __common_ticktime type, redesigned LPC PLC timer support
edouard
parents: 502
diff changeset
    45
	}else{
425
f390e9fdd2cf Add new target (Makefile)
greg
parents:
diff changeset
    46
		return 1;
518
8e61b0066859 Fixed confusion about __common_ticktime type, redesigned LPC PLC timer support
edouard
parents: 502
diff changeset
    47
	}
425
f390e9fdd2cf Add new target (Makefile)
greg
parents:
diff changeset
    48
}
f390e9fdd2cf Add new target (Makefile)
greg
parents:
diff changeset
    49
f390e9fdd2cf Add new target (Makefile)
greg
parents:
diff changeset
    50
int TryEnterDebugSection(void)
f390e9fdd2cf Add new target (Makefile)
greg
parents:
diff changeset
    51
{
577
04baf6607a44 LPC : Completed initial debug support
edouard
parents: 521
diff changeset
    52
    if(!debug_locked && __DEBUG){
04baf6607a44 LPC : Completed initial debug support
edouard
parents: 521
diff changeset
    53
        debug_locked = 1;
04baf6607a44 LPC : Completed initial debug support
edouard
parents: 521
diff changeset
    54
		return 1;
04baf6607a44 LPC : Completed initial debug support
edouard
parents: 521
diff changeset
    55
    }
04baf6607a44 LPC : Completed initial debug support
edouard
parents: 521
diff changeset
    56
    return 0;
425
f390e9fdd2cf Add new target (Makefile)
greg
parents:
diff changeset
    57
}
f390e9fdd2cf Add new target (Makefile)
greg
parents:
diff changeset
    58
f390e9fdd2cf Add new target (Makefile)
greg
parents:
diff changeset
    59
void LeaveDebugSection(void)
f390e9fdd2cf Add new target (Makefile)
greg
parents:
diff changeset
    60
{
577
04baf6607a44 LPC : Completed initial debug support
edouard
parents: 521
diff changeset
    61
        debug_locked = 0;
425
f390e9fdd2cf Add new target (Makefile)
greg
parents:
diff changeset
    62
}
f390e9fdd2cf Add new target (Makefile)
greg
parents:
diff changeset
    63
f390e9fdd2cf Add new target (Makefile)
greg
parents:
diff changeset
    64
int stopPLC(void)
f390e9fdd2cf Add new target (Makefile)
greg
parents:
diff changeset
    65
{
f390e9fdd2cf Add new target (Makefile)
greg
parents:
diff changeset
    66
    __cleanup();
f390e9fdd2cf Add new target (Makefile)
greg
parents:
diff changeset
    67
    return 0;
f390e9fdd2cf Add new target (Makefile)
greg
parents:
diff changeset
    68
}
f390e9fdd2cf Add new target (Makefile)
greg
parents:
diff changeset
    69
f390e9fdd2cf Add new target (Makefile)
greg
parents:
diff changeset
    70
/* from plc_debugger.c */
452
2d0718a05cc7 Reflect changes in iec type definitions in matiec/lib
edouard
parents: 425
diff changeset
    71
int WaitDebugData(unsigned long *tick)
425
f390e9fdd2cf Add new target (Makefile)
greg
parents:
diff changeset
    72
{
577
04baf6607a44 LPC : Completed initial debug support
edouard
parents: 521
diff changeset
    73
    /* no blocking call on LPC */
04baf6607a44 LPC : Completed initial debug support
edouard
parents: 521
diff changeset
    74
    if(_DebugDataAvailable && !debug_locked){
04baf6607a44 LPC : Completed initial debug support
edouard
parents: 521
diff changeset
    75
        /* returns 0 on success */
04baf6607a44 LPC : Completed initial debug support
edouard
parents: 521
diff changeset
    76
        *tick = __debug_tick;
04baf6607a44 LPC : Completed initial debug support
edouard
parents: 521
diff changeset
    77
        _DebugDataAvailable = 0;
04baf6607a44 LPC : Completed initial debug support
edouard
parents: 521
diff changeset
    78
        return 0;
04baf6607a44 LPC : Completed initial debug support
edouard
parents: 521
diff changeset
    79
    }
04baf6607a44 LPC : Completed initial debug support
edouard
parents: 521
diff changeset
    80
    return 1;
425
f390e9fdd2cf Add new target (Makefile)
greg
parents:
diff changeset
    81
}
f390e9fdd2cf Add new target (Makefile)
greg
parents:
diff changeset
    82
f390e9fdd2cf Add new target (Makefile)
greg
parents:
diff changeset
    83
/* Called by PLC thread when debug_publish finished
f390e9fdd2cf Add new target (Makefile)
greg
parents:
diff changeset
    84
 * This is supposed to unlock debugger thread in WaitDebugData*/
f390e9fdd2cf Add new target (Makefile)
greg
parents:
diff changeset
    85
void InitiateDebugTransfer(void)
f390e9fdd2cf Add new target (Makefile)
greg
parents:
diff changeset
    86
{
577
04baf6607a44 LPC : Completed initial debug support
edouard
parents: 521
diff changeset
    87
    /* remember tick */
04baf6607a44 LPC : Completed initial debug support
edouard
parents: 521
diff changeset
    88
    __debug_tick = __tick;
502
5343ae43f6d0 LPC connector - one step further
edouard
parents: 497
diff changeset
    89
    _DebugDataAvailable = 1;
425
f390e9fdd2cf Add new target (Makefile)
greg
parents:
diff changeset
    90
}
f390e9fdd2cf Add new target (Makefile)
greg
parents:
diff changeset
    91
502
5343ae43f6d0 LPC connector - one step further
edouard
parents: 497
diff changeset
    92
void suspendDebug(int disable)
425
f390e9fdd2cf Add new target (Makefile)
greg
parents:
diff changeset
    93
{
577
04baf6607a44 LPC : Completed initial debug support
edouard
parents: 521
diff changeset
    94
    /* Prevent PLC to enter debug code */
502
5343ae43f6d0 LPC connector - one step further
edouard
parents: 497
diff changeset
    95
    __DEBUG = !disable;
577
04baf6607a44 LPC : Completed initial debug support
edouard
parents: 521
diff changeset
    96
    debug_locked = !disable;
425
f390e9fdd2cf Add new target (Makefile)
greg
parents:
diff changeset
    97
}
f390e9fdd2cf Add new target (Makefile)
greg
parents:
diff changeset
    98
f390e9fdd2cf Add new target (Makefile)
greg
parents:
diff changeset
    99
void resumeDebug(void)
f390e9fdd2cf Add new target (Makefile)
greg
parents:
diff changeset
   100
{
577
04baf6607a44 LPC : Completed initial debug support
edouard
parents: 521
diff changeset
   101
    /* Let PLC enter debug code */
502
5343ae43f6d0 LPC connector - one step further
edouard
parents: 497
diff changeset
   102
    __DEBUG = 1;
577
04baf6607a44 LPC : Completed initial debug support
edouard
parents: 521
diff changeset
   103
    debug_locked = 0;
425
f390e9fdd2cf Add new target (Makefile)
greg
parents:
diff changeset
   104
}
483
bc26c42d2eec fixed greg's crap in win32, enhanced debug stability, implemented preliminary retain
edouard
parents: 478
diff changeset
   105
521
02cb9e5fb6f6 LPC transfer tested, added PLCInfo along MD5 checksum while invoking makefile
edouard
parents: 518
diff changeset
   106
int CheckRetainBuffer(void)
02cb9e5fb6f6 LPC transfer tested, added PLCInfo along MD5 checksum while invoking makefile
edouard
parents: 518
diff changeset
   107
{
02cb9e5fb6f6 LPC transfer tested, added PLCInfo along MD5 checksum while invoking makefile
edouard
parents: 518
diff changeset
   108
	/* TODO : compare RETAIN buffer start with MD5 */
02cb9e5fb6f6 LPC transfer tested, added PLCInfo along MD5 checksum while invoking makefile
edouard
parents: 518
diff changeset
   109
	return 0;
02cb9e5fb6f6 LPC transfer tested, added PLCInfo along MD5 checksum while invoking makefile
edouard
parents: 518
diff changeset
   110
}
02cb9e5fb6f6 LPC transfer tested, added PLCInfo along MD5 checksum while invoking makefile
edouard
parents: 518
diff changeset
   111
483
bc26c42d2eec fixed greg's crap in win32, enhanced debug stability, implemented preliminary retain
edouard
parents: 478
diff changeset
   112
void Retain(unsigned int offset, unsigned int count, void *p)
497
ed7f72fc785f Typo in LPC
edouard
parents: 483
diff changeset
   113
{
521
02cb9e5fb6f6 LPC transfer tested, added PLCInfo along MD5 checksum while invoking makefile
edouard
parents: 518
diff changeset
   114
	/* TODO : write in RETAIN buffer at offset*/
483
bc26c42d2eec fixed greg's crap in win32, enhanced debug stability, implemented preliminary retain
edouard
parents: 478
diff changeset
   115
}
bc26c42d2eec fixed greg's crap in win32, enhanced debug stability, implemented preliminary retain
edouard
parents: 478
diff changeset
   116
bc26c42d2eec fixed greg's crap in win32, enhanced debug stability, implemented preliminary retain
edouard
parents: 478
diff changeset
   117
void Remind(unsigned int offset, unsigned int count, void *p)
bc26c42d2eec fixed greg's crap in win32, enhanced debug stability, implemented preliminary retain
edouard
parents: 478
diff changeset
   118
{
521
02cb9e5fb6f6 LPC transfer tested, added PLCInfo along MD5 checksum while invoking makefile
edouard
parents: 518
diff changeset
   119
	/* TODO : read at offset in RETAIN buffer */
483
bc26c42d2eec fixed greg's crap in win32, enhanced debug stability, implemented preliminary retain
edouard
parents: 478
diff changeset
   120
}