git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@971 35acf78f-673a-0410-8e92-d51de3d6d3f4

This commit is contained in:
gdisirio 2009-05-15 14:20:14 +00:00
parent 04faaf563c
commit 1c3d2376a6
2 changed files with 102 additions and 3 deletions

View File

@ -151,7 +151,7 @@ typedef struct {
* @return A byte value from the queue or:
* @retval Q_RESET if the channel associated queue (if any) was reset.
*/
#define chIOGet(ip) ((ip)->vmt->m0.put(ip, TIME_INFINITE))
#define chIOGet(ip) ((ip)->vmt->m0.get(ip, TIME_INFINITE))
/**
* @brief Channel blocking byte read with timeout.
@ -168,7 +168,7 @@ typedef struct {
* @retval Q_TIMEOUT if the specified time expired.
* @retval Q_RESET if the channel associated queue (if any) was reset.
*/
#define chIOGetTimeout(ip, timeout) ((ip)->vmt->m0.put(ip, timeout))
#define chIOGetTimeout(ip, timeout) ((ip)->vmt->m0.get(ip, timeout))
#if CH_USE_EVENTS
/**

View File

@ -51,6 +51,105 @@
#if CH_USE_SERIAL_FULLDUPLEX
#define TEST_QUEUES_SIZE 8
static FullDuplexDriver fdd;
/* Loopback thread, it simulates a low level driver. The thread terminates by
sending a zero through the loopback driver.*/
static msg_t thread1(void *p) {
while (TRUE) {
chEvtWaitAny(1);
chSysLock();
while (TRUE) {
msg_t b = chFDDRequestDataI(&fdd);
if (b < Q_OK)
break;
if (b == 0) {
chSchRescheduleS();
chSysUnlock();
return 0;
}
chFDDIncomingDataI(&fdd, (uint8_t)b);
chSchRescheduleS();
}
chSysUnlock();
}
}
static void infy(void) {}
static void onfy(void) {
chEvtSignalI(threads[0], 1);
chSchRescheduleS();
}
/**
* @page test_serial_001 Loopback test
*
* <h2>Description</h2>
* A sequence of characters are sent to the loopback driver and read back. The
* test is performed twice using both the direct APIs and the channels API
* implementations.<br>
* The test expects to read all the characters back and in the correct
* sequence.
*/
static char *serial1_gettest(void) {
return "Serial driver, loopback";
}
static void serial1_setup(void) {
chFDDInit(&fdd, wa[3], 8, infy, wa[4], 8, onfy);
}
static void serial1_execute(void) {
unsigned i;
msg_t b;
/* Loopback test using the direct APIs.*/
threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriority() + 1,
thread1, 0);
for (i = 0; i < 4; i++) {
chFDDPut(&fdd, 'A' + i);
b = chFDDGetTimeout(&fdd, S2ST(1));
if (b < Q_OK)
break;
test_emit_token(b);
}
chFDDPut(&fdd, 0);
test_assert_sequence(1, "ABCD");
test_assert(2, chFDDPutWouldBlock(&fdd) == FALSE, "output would block");
test_assert(3, chFDDGetWouldBlock(&fdd) == TRUE, "input would not block");
test_wait_threads();
/* Loopback test using the channel APIs.*/
threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriority() + 1,
thread1, 0);
for (i = 0; i < 4; i++) {
chIOPut(&fdd, 'A' + i);
b = chIOGetTimeout(&fdd, S2ST(1));
if (b < Q_OK)
break;
test_emit_token(b);
}
chIOPut(&fdd, 0);
test_assert_sequence(4, "ABCD");
test_assert(5, chIOPutWouldBlock(&fdd) == FALSE, "output would block");
test_assert(6, chIOGetWouldBlock(&fdd) == TRUE, "input would not block");
test_wait_threads();
}
const struct testcase testserial1 = {
serial1_gettest,
serial1_setup,
NULL,
serial1_execute
};
#endif /* CH_USE_SERIAL_FULLDUPLEX */
/*
@ -58,7 +157,7 @@
*/
const struct testcase * const patternserial[] = {
#if CH_USE_SERIAL_FULLDUPLEX
// &testserial1,
&testserial1,
#endif
NULL
};