console::wait_char could wake-up by spurious wake-ups and thus crash as input_buffer was empty sometimes
This commit is contained in:
parent
ab268f5ca6
commit
f6c1c1440e
5 changed files with 34 additions and 38 deletions
8
ESP32/esp32.h
Normal file
8
ESP32/esp32.h
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#if defined(ESP32)
|
||||||
|
#include <SPI.h>
|
||||||
|
#define USE_SDFAT
|
||||||
|
#define SD_FAT_TYPE 1
|
||||||
|
#include <SdFat.h>
|
||||||
|
#endif
|
|
@ -9,16 +9,10 @@
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
#if defined(ESP32)
|
|
||||||
#include <SPI.h>
|
|
||||||
#define USE_SDFAT
|
|
||||||
#define SD_FAT_TYPE 1
|
|
||||||
#include <SdFat.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "console_esp32.h"
|
#include "console_esp32.h"
|
||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
#include "error.h"
|
#include "error.h"
|
||||||
|
#include "esp32.h"
|
||||||
#include "memory.h"
|
#include "memory.h"
|
||||||
#include "tty.h"
|
#include "tty.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
@ -67,13 +61,20 @@ void setBootLoader(bus *const b) {
|
||||||
c->setRegister(7, offset);
|
c->setRegister(7, offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
void console_thread_wrapper(void *const c)
|
void console_thread_wrapper_panel(void *const c)
|
||||||
{
|
{
|
||||||
console *const cnsl = reinterpret_cast<console *>(c);
|
console *const cnsl = reinterpret_cast<console *>(c);
|
||||||
|
|
||||||
cnsl->panel_update_thread();
|
cnsl->panel_update_thread();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void console_thread_wrapper_io(void *const c)
|
||||||
|
{
|
||||||
|
console *const cnsl = reinterpret_cast<console *>(c);
|
||||||
|
|
||||||
|
cnsl->operator()();
|
||||||
|
}
|
||||||
|
|
||||||
void setup_wifi_stations()
|
void setup_wifi_stations()
|
||||||
{
|
{
|
||||||
#if 0
|
#if 0
|
||||||
|
@ -198,12 +199,17 @@ void setup() {
|
||||||
Serial.print(F("Starting panel (on CPU 0, main emulator runs on CPU "));
|
Serial.print(F("Starting panel (on CPU 0, main emulator runs on CPU "));
|
||||||
Serial.print(xPortGetCoreID());
|
Serial.print(xPortGetCoreID());
|
||||||
Serial.println(F(")"));
|
Serial.println(F(")"));
|
||||||
xTaskCreatePinnedToCore(&console_thread_wrapper, "panel", 2048, cnsl, 1, nullptr, 0);
|
xTaskCreatePinnedToCore(&console_thread_wrapper_panel, "panel", 2048, cnsl, 1, nullptr, 0);
|
||||||
|
|
||||||
|
xTaskCreatePinnedToCore(&console_thread_wrapper_io, "c-io", 2048, cnsl, 1, nullptr, 0);
|
||||||
|
|
||||||
// setup_wifi_stations();
|
// setup_wifi_stations();
|
||||||
|
|
||||||
Serial.println(F("Load RK05"));
|
Serial.println(F("Load RK05"));
|
||||||
b->add_rk05(new rk05(select_disk_files(cnsl), b, cnsl->get_disk_read_activity_flag(), cnsl->get_disk_write_activity_flag()));
|
auto disk_files = select_disk_files(cnsl);
|
||||||
|
|
||||||
|
b->add_rk05(new rk05(disk_files, b, cnsl->get_disk_read_activity_flag(), cnsl->get_disk_write_activity_flag()));
|
||||||
|
|
||||||
setBootLoader(b);
|
setBootLoader(b);
|
||||||
|
|
||||||
Serial.print(F("Free RAM after init: "));
|
Serial.print(F("Free RAM after init: "));
|
||||||
|
@ -260,26 +266,6 @@ void dump_state(bus *const b) {
|
||||||
Serial.println(t_diff);
|
Serial.println(t_diff);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool poll_char()
|
|
||||||
{
|
|
||||||
return Serial.available() > 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
char get_char()
|
|
||||||
{
|
|
||||||
char c = Serial.read();
|
|
||||||
|
|
||||||
if (c == 5)
|
|
||||||
dump_state(b);
|
|
||||||
|
|
||||||
return c;
|
|
||||||
}
|
|
||||||
|
|
||||||
void put_char(char c)
|
|
||||||
{
|
|
||||||
Serial.print(c);
|
|
||||||
}
|
|
||||||
|
|
||||||
void loop() {
|
void loop() {
|
||||||
icount++;
|
icount++;
|
||||||
|
|
||||||
|
|
|
@ -12,5 +12,5 @@ monitor_speed = 115200
|
||||||
upload_speed = 1000000
|
upload_speed = 1000000
|
||||||
lib_deps = greiman/SdFat@^2.1.2
|
lib_deps = greiman/SdFat@^2.1.2
|
||||||
adafruit/Adafruit NeoPixel@^1.10.4
|
adafruit/Adafruit NeoPixel@^1.10.4
|
||||||
build_flags = -std=gnu++17 -Ofast -DESP32=1
|
build_flags = -std=gnu++17 -Ofast -DESP32=1 -ggdb3
|
||||||
build_unflags = -std=gnu++11 -Os
|
build_unflags = -std=gnu++11 -Os
|
||||||
|
|
|
@ -26,7 +26,9 @@ void console::start_thread()
|
||||||
{
|
{
|
||||||
stop_thread_flag = false;
|
stop_thread_flag = false;
|
||||||
|
|
||||||
|
#if !defined(ESP32)
|
||||||
th = new std::thread(std::ref(*this));
|
th = new std::thread(std::ref(*this));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void console::stop_thread()
|
void console::stop_thread()
|
||||||
|
@ -69,12 +71,14 @@ int console::wait_char(const int timeout_ms)
|
||||||
using namespace std::chrono_literals;
|
using namespace std::chrono_literals;
|
||||||
|
|
||||||
if (input_buffer.empty() == false || have_data.wait_for(lck, timeout_ms * 1ms) == std::cv_status::no_timeout) {
|
if (input_buffer.empty() == false || have_data.wait_for(lck, timeout_ms * 1ms) == std::cv_status::no_timeout) {
|
||||||
|
if (input_buffer.empty() == false) {
|
||||||
int c = input_buffer.at(0);
|
int c = input_buffer.at(0);
|
||||||
|
|
||||||
input_buffer.erase(input_buffer.begin() + 0);
|
input_buffer.erase(input_buffer.begin() + 0);
|
||||||
|
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
6
rk05.h
6
rk05.h
|
@ -9,12 +9,10 @@
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#if defined(ESP32)
|
#if defined(ESP32)
|
||||||
#include <SPI.h>
|
#include "esp32.h"
|
||||||
#define USE_SDFAT
|
|
||||||
#define SD_FAT_TYPE 1
|
|
||||||
#include <SdFat.h>
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
// FIXME namen van defines
|
// FIXME namen van defines
|
||||||
#define RK05_DS 0177400 // drive status
|
#define RK05_DS 0177400 // drive status
|
||||||
#define RK05_ERROR 0177402 // error
|
#define RK05_ERROR 0177402 // error
|
||||||
|
|
Loading…
Add table
Reference in a new issue