📄 bsp.cpp
字号:
//////////////////////////////////////////////////////////////////////////////// Product: QDPP example, 80x86, Linux/P-threads, g++// Last Updated for Version: 3.3.00// Date of the Last Update: Jan 24, 2007//// Q u a n t u m L e a P s// ---------------------------// innovating embedded systems//// Copyright (C) 2002-2007 Quantum Leaps, LLC. All rights reserved.//// This software may be distributed and modified under the terms of the GNU// General Public License version 2 (GPL) as published by the Free Software// Foundation and appearing in the file GPL.TXT included in the packaging of// this file. Please note that GPL Section 2[b] requires that all works based// on this software must also be made publicly available under the terms of// the GPL ("Copyleft").//// Alternatively, this software may be distributed and modified under the// terms of Quantum Leaps commercial licenses, which expressly supersede// the GPL and are specifically designed for licensees interested in// retaining the proprietary status of their code.//// Contact information:// Quantum Leaps Web site: http://www.quantum-leaps.com// e-mail: sales@quantum-leaps.com//////////////////////////////////////////////////////////////////////////////#include "qf_port.h"#include "qassert.h"#include "qdpp.h"#include <stdlib.h>#include <stdio.h>#include <sys/select.h>#include <termios.h>#include <unistd.h>Q_DEFINE_THIS_FILE//............................................................................static void *idleThread(void *me) { // the expected P-Thread signature struct timeval timeout = { 0 }; // timeout for select() struct termios tio; // modified terminal attributes tcgetattr(0, &tio); // obtain the current terminal attributes tio.c_lflag &= ~(ICANON | ECHO); // disable the canonical mode & echo tcsetattr(0, TCSANOW, &tio); // set the new attributes while (QF_running_) { fd_set con; // FD set representing the console FD_ZERO(&con); FD_SET(0, &con); timeout.tv_usec = 8000; // sleep for the full tick or until a console input arrives, NOTE01 if (0 != select(1, &con, 0, 0, &timeout)) { // any descriptor set? char ch; read(0, &ch, 1); if (ch == '\33') { // ESC pressed? QF::publish(Q_NEW(QEvent, TERMINATE_SIG)); } } } return (void *)0; // return success}//............................................................................void BSP_init(int argc, char *argv[]) { pthread_attr_t attr; struct sched_param param; pthread_t idle; pthread_attr_init(&attr); // SCHED_FIFO corresponds to real-time preemptive priority-based scheduler // NOTE: This scheduling policy requires the superuser priviledges pthread_attr_setschedpolicy(&attr, SCHED_FIFO); param.sched_priority = sched_get_priority_min(SCHED_FIFO); pthread_attr_setschedparam(&attr, ¶m); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); if (pthread_create(&idle, &attr, &idleThread, 0) != 0) { // Creating the p-thread with the SCHED_FIFO policy failed. // Most probably this application has no superuser privileges, // so we just fall back to the default SCHED_OTHER policy // and priority 0. pthread_attr_setschedpolicy(&attr, SCHED_OTHER); param.sched_priority = 0; pthread_attr_setschedparam(&attr, ¶m); Q_ALLEGE(pthread_create(&idle, &attr, &idleThread, 0) == 0); } pthread_attr_destroy(&attr);}//............................................................................void displyPhilStat(uint8_t n, char const *stat) { printf("Philosopher %2d is %s\n", (int)n, stat);}//............................................................................void Q_assert_handler(char const Q_ROM * const Q_ROM_VAR file, int line) { fprintf(stderr, "Assertion failed in %s, line %d", file, line); QF::exit();}////////////////////////////////////////////////////////////////////////////////// NOTE01:// The select() system call seems to deliver the finest time granularity of// 1 clock tick. The timeout value passed to select() is rounded up to the// nearest tick (10 ms on desktop Linux). The timeout cannot be too short,// because the system might choose to busy-wait for very short timeouts.// An alternative, POSIX nanosleep() system call seems to deliver only 20ms// granularity.//// Here the select() call is used not just as a fairly portable way to sleep// with subsecond precision. The select() call is also used to detect any// characters typed on the console to//// Also according to man pages, on Linux, the function select() modifies// timeout to reflect the amount of time not slept; most other implementations// do not do this. This causes problems both when Linux code which reads// timeout is ported to other operating systems, and when code is ported to// Linux that reuses a struct timeval for multiple selects in a loop without// reinitializing it. Here the microsecond part of the structure is re-// initialized before each select() call.//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -