strat: statically allocate additional threads

This commit is contained in:
Michael Scire
2019-10-18 20:31:15 -07:00
committed by SciresM
parent fbb5730369
commit 535e49a38d
17 changed files with 123 additions and 42 deletions

View File

@@ -32,8 +32,9 @@ extern "C" {
u32 __nx_applet_type = AppletType_None;
u32 __nx_fs_num_sessions = 1;
u32 __nx_fsdev_direntry_cache_size = 1;
#define INNER_HEAP_SIZE 0x2A0000
#define INNER_HEAP_SIZE 0x240000
size_t nx_inner_heap_size = INNER_HEAP_SIZE;
char nx_inner_heap[INNER_HEAP_SIZE];

View File

@@ -45,7 +45,7 @@ namespace sts::fatal::srv {
public:
TaskThread() { /* ... */ }
void StartTask(ITask *task) {
R_ASSERT(this->thread.Initialize(&RunTaskImpl, task, task->GetStackSize(), TaskThreadPriority));
R_ASSERT(this->thread.Initialize(&RunTaskImpl, task, task->GetStack(), task->GetStackSize(), TaskThreadPriority));
R_ASSERT(this->thread.Start());
}
};

View File

@@ -22,8 +22,6 @@
namespace sts::fatal::srv {
class ITask {
public:
static constexpr size_t DefaultStackSize = 0x1000;
protected:
const ThrowContext *context = nullptr;
public:
@@ -32,14 +30,30 @@ namespace sts::fatal::srv {
}
virtual Result Run() = 0;
virtual const char *GetName() const = 0;
virtual u8 *GetStack() = 0;
virtual size_t GetStackSize() const = 0;
};
virtual size_t GetStackSize() const {
return DefaultStackSize;
template<size_t _StackSize>
class ITaskWithStack : public ITask {
public:
static constexpr size_t StackSize = _StackSize;
static_assert(util::IsAligned(StackSize, 0x1000), "StackSize alignment");
protected:
alignas(0x1000) u8 stack_mem[StackSize] = {};
public:
virtual u8 *GetStack() override final {
return this->stack_mem;
}
virtual size_t GetStackSize() const override final {
return StackSize;
}
};
using ITaskWithDefaultStack = ITaskWithStack<0x2000>;
void RunTasks(const ThrowContext *ctx);
}

View File

@@ -22,7 +22,7 @@ namespace sts::fatal::srv {
namespace {
/* Task definition. */
class AdjustClockTask : public ITask {
class AdjustClockTask : public ITaskWithDefaultStack {
private:
Result AdjustClockForModule(PcvModule module, u32 hz);
Result AdjustClock();

View File

@@ -53,7 +53,7 @@ namespace sts::fatal::srv {
}
/* Task definition. */
class ErrorReportTask : public ITask {
class ErrorReportTask : public ITaskWithDefaultStack {
private:
void SaveReportToSdCard();
public:

View File

@@ -22,7 +22,7 @@ namespace sts::fatal::srv {
namespace {
/* Task types. */
class PowerControlTask : public ITask {
class PowerControlTask : public ITaskWithDefaultStack {
private:
bool TryShutdown();
void MonitorBatteryState();
@@ -33,7 +33,7 @@ namespace sts::fatal::srv {
}
};
class PowerButtonObserveTask : public ITask {
class PowerButtonObserveTask : public ITaskWithDefaultStack {
private:
void WaitForPowerButton();
public:
@@ -43,7 +43,7 @@ namespace sts::fatal::srv {
}
};
class StateTransitionStopTask : public ITask {
class StateTransitionStopTask : public ITaskWithDefaultStack {
public:
virtual Result Run() override;
virtual const char *GetName() const override {

View File

@@ -53,7 +53,7 @@ namespace sts::fatal::srv {
}
/* Task definitions. */
class ShowFatalTask : public ITask {
class ShowFatalTask : public ITaskWithStack<0x8000> {
private:
ViDisplay display;
ViLayer layer;
@@ -69,12 +69,9 @@ namespace sts::fatal::srv {
virtual const char *GetName() const override {
return "ShowFatal";
}
virtual size_t GetStackSize() const override {
return 0x8000;
}
};
class BacklightControlTask : public ITask {
class BacklightControlTask : public ITaskWithDefaultStack {
private:
void TurnOnBacklight();
public:

View File

@@ -21,7 +21,7 @@ namespace sts::fatal::srv {
namespace {
/* Task definition. */
class StopSoundTask : public ITask {
class StopSoundTask : public ITaskWithDefaultStack {
private:
void StopSound();
public: