Merge pull request #2831 from opentx/bsongis/arm_tasks_refactoring

Bsongis/arm tasks refactoring
This commit is contained in:
Bertrand Songis
2015-09-05 20:29:20 +02:00
10 changed files with 194 additions and 88 deletions
+42 -4
View File
@@ -37,12 +37,11 @@
#include "opentx.h"
#include <ctype.h>
#define CLI_STACK_SIZE 500
#define CLI_COMMAND_MAX_ARGS 8
#define CLI_COMMAND_MAX_LEN 256
OS_TID cliTaskId;
OS_STK cliStack[CLI_STACK_SIZE];
TaskStack<CLI_STACK_SIZE> cliStack;
Fifo<256> cliRxFifo;
uint8_t cliTracesEnabled = false;
@@ -151,6 +150,44 @@ int cliTrace(const char ** argv)
return 0;
}
int cliStackInfo(const char ** argv)
{
int tid = 0;
if (toInt(argv, 1, &tid) > 0) {
int available = 0;
int total = 0;
switch(tid) {
case MENU_TASK_INDEX:
total = menusStack.size();
available = menusStack.available();
break;
case MIXER_TASK_INDEX:
total = mixerStack.size();
available = mixerStack.available();
break;
case AUDIO_TASK_INDEX:
total = audioStack.size();
available = audioStack.available();
break;
case CLI_TASK_INDEX:
total = cliStack.size();
available = cliStack.available();
break;
case MAIN_TASK_INDEX:
total = stackAvailable();
available = stackSize();
break;
default:
break;
}
serialPrint("%d available (%d total)", available, total);
}
else {
serialPrint("%s: Invalid argument \"%s\"", argv[0], argv[1]);
}
return 0;
}
int cliVolume(const char ** argv)
{
int level = 0;
@@ -214,6 +251,7 @@ const CliCommand cliCommands[] = {
{ "ls", cliLs, "<directory>" },
{ "play", cliPlay, "<filename>" },
{ "print", cliDisplay, "<address> [<size>] | <what>" },
{ "stackinfo", cliStackInfo, "<tid>" },
{ "trace", cliTrace, "on | off" },
{ "volume", cliVolume, "<level>" },
{ "help", cliHelp, "[<command>]" },
@@ -279,7 +317,7 @@ void cliTask(void * pdata)
uint8_t c;
while (!cliRxFifo.pop(c)) {
CoTickDelay(5); // 10ms
CoTickDelay(10); // 20ms
}
if (c == 12) {
@@ -311,5 +349,5 @@ void cliTask(void * pdata)
void cliStart()
{
cliTaskId = CoCreateTaskEx(cliTask, NULL, 10, &cliStack[CLI_STACK_SIZE-1], CLI_STACK_SIZE, 1, false);
cliTaskId = CoCreateTaskEx(cliTask, NULL, 10, &cliStack.stack[CLI_STACK_SIZE-1], CLI_STACK_SIZE, 1, false);
}
+3
View File
@@ -44,6 +44,9 @@ extern uint8_t cliTracesEnabled;
#ifdef __cplusplus
#include "fifo.h"
extern Fifo<256> cliRxFifo;
#include "tasks_arm.h"
#define CLI_STACK_SIZE 1000
extern TaskStack<CLI_STACK_SIZE> cliStack;
#endif
void cliStart();
+2
View File
@@ -40,7 +40,9 @@
#include <inttypes.h>
#include "rtc.h"
#include "dump.h"
#if defined(CLI)
#include "cli.h"
#endif
#if defined(__cplusplus)
extern "C" {
+4 -4
View File
@@ -196,11 +196,11 @@ void menuStatisticsDebug(uint8_t event)
#if defined(CPUARM)
lcd_putsLeft(MENU_DEBUG_Y_RTOS, STR_FREESTACKMINB);
lcd_outdezAtt(MENU_DEBUG_COL1_OFS, MENU_DEBUG_Y_RTOS+2, stack_free(0), UNSIGN|LEFT|TINSIZE);
lcd_outdezAtt(MENU_DEBUG_COL1_OFS, MENU_DEBUG_Y_RTOS+2, menusStack.available(), UNSIGN|LEFT|TINSIZE);
lcd_puts(lcdLastPos, MENU_DEBUG_Y_RTOS, "/");
lcd_outdezAtt(lcdLastPos, MENU_DEBUG_Y_RTOS+2, stack_free(1), UNSIGN|LEFT|TINSIZE);
lcd_outdezAtt(lcdLastPos, MENU_DEBUG_Y_RTOS+2, mixerStack.available(), UNSIGN|LEFT|TINSIZE);
lcd_puts(lcdLastPos, MENU_DEBUG_Y_RTOS, "/");
lcd_outdezAtt(lcdLastPos, MENU_DEBUG_Y_RTOS+2, stack_free(2), UNSIGN|LEFT|TINSIZE);
lcd_outdezAtt(lcdLastPos, MENU_DEBUG_Y_RTOS+2, audioStack.available(), UNSIGN|LEFT|TINSIZE);
#endif
#if !defined(CPUARM)
@@ -213,7 +213,7 @@ void menuStatisticsDebug(uint8_t event)
lcd_putsLeft(4*FH, STR_TMIXMAXMS);
lcd_outdezAtt(MENU_DEBUG_COL1_OFS, 4*FH, DURATION_MS_PREC2(maxMixerDuration), PREC2);
lcd_putsLeft(5*FH, STR_FREESTACKMINB);
lcd_outdezAtt(14*FW, 5*FH, stack_free(), UNSIGN) ;
lcd_outdezAtt(14*FW, 5*FH, stackAvailable(), UNSIGN) ;
#endif
lcd_puts(4*FW, 7*FH+1, STR_MENUTORESET);
+5 -5
View File
@@ -163,7 +163,7 @@ void menuStatisticsDebug(uint8_t event)
}
lcd_putsLeft(MENU_DEBUG_Y_FREE_RAM, "Free Mem");
lcd_outdezAtt(MENU_DEBUG_COL1_OFS, MENU_DEBUG_Y_FREE_RAM, getAvailableMemory(), LEFT);
lcd_outdezAtt(MENU_DEBUG_COL1_OFS, MENU_DEBUG_Y_FREE_RAM, availableMemory(), LEFT);
lcd_puts(lcdLastPos, MENU_DEBUG_Y_FREE_RAM, "b");
#if defined(LUA)
@@ -189,13 +189,13 @@ void menuStatisticsDebug(uint8_t event)
lcd_putsLeft(MENU_DEBUG_Y_RTOS, STR_FREESTACKMINB);
lcd_putsAtt(MENU_DEBUG_COL1_OFS, MENU_DEBUG_Y_RTOS+1, "[M]", SMLSIZE);
lcd_outdezAtt(lcdLastPos, MENU_DEBUG_Y_RTOS, stack_free(0), UNSIGN|LEFT);
lcd_outdezAtt(lcdLastPos, MENU_DEBUG_Y_RTOS, menusStack.available(), UNSIGN|LEFT);
lcd_putsAtt(lcdLastPos+2, MENU_DEBUG_Y_RTOS+1, "[X]", SMLSIZE);
lcd_outdezAtt(lcdLastPos, MENU_DEBUG_Y_RTOS, stack_free(1), UNSIGN|LEFT);
lcd_outdezAtt(lcdLastPos, MENU_DEBUG_Y_RTOS, mixerStack.available(), UNSIGN|LEFT);
lcd_putsAtt(lcdLastPos+2, MENU_DEBUG_Y_RTOS+1, "[A]", SMLSIZE);
lcd_outdezAtt(lcdLastPos, MENU_DEBUG_Y_RTOS, stack_free(2), UNSIGN|LEFT);
lcd_outdezAtt(lcdLastPos, MENU_DEBUG_Y_RTOS, audioStack.available(), UNSIGN|LEFT);
lcd_putsAtt(lcdLastPos+2, MENU_DEBUG_Y_RTOS+1, "[I]", SMLSIZE);
lcd_outdezAtt(lcdLastPos, MENU_DEBUG_Y_RTOS, stack_free(255), UNSIGN|LEFT);
lcd_outdezAtt(lcdLastPos, MENU_DEBUG_Y_RTOS, stackAvailable(), UNSIGN|LEFT);
lcd_puts(3*FW, 7*FH+1, STR_MENUTORESET);
lcd_status_line();
+3 -3
View File
@@ -2348,7 +2348,7 @@ void moveTrimsToOffsets() // copy state of 3 primary to subtrim
#if !defined(CPUARM) && !defined(SIMU)
extern unsigned char __bss_end ;
#define STACKPTR _SFR_IO16(0x3D)
void stack_paint()
void stackPaint()
{
// Init Stack while interrupts are disabled
unsigned char *p ;
@@ -2362,7 +2362,7 @@ void stack_paint()
}
}
uint16_t stack_free()
uint16_t stackAvailable()
{
unsigned char *p ;
@@ -2492,7 +2492,7 @@ int main(void)
lcdInit();
#endif
stack_paint();
stackPaint();
#if defined(GUI)
g_menuStack[0] = menuMainView;
+5 -13
View File
@@ -717,14 +717,14 @@ extern uint8_t flightModeTransitionLast;
#endif
#if defined(SIMU)
inline int getAvailableMemory() { return 1000; }
inline int availableMemory() { return 1000; }
#elif defined(CPUARM) && !defined(SIMU)
extern unsigned char *heap;
extern int _end;
extern int _estack;
extern int _main_stack_start;
extern int _heap_end;
#define getAvailableMemory() ((unsigned int)((unsigned char *)&_heap_end - heap))
#define availableMemory() ((unsigned int)((unsigned char *)&_heap_end - heap))
#endif
void evalFlightModeMixes(uint8_t mode, uint8_t tick10ms);
@@ -942,11 +942,8 @@ extern uint16_t lastMixerDuration;
uint16_t getTmr16KHz();
#endif
#if defined(CPUARM)
uint32_t stack_free(uint32_t tid);
void stack_paint();
#else
uint16_t stack_free();
#if !defined(CPUARM)
uint16_t stackAvailable();
#endif
#if defined(SPLASH)
@@ -1050,12 +1047,7 @@ template<class t> void SWAP(t & a, t & b) { t tmp = b; b = a; a = tmp; }
uint16_t isqrt32(uint32_t n);
#if defined(CPUARM) && !defined(BOOT)
#if !defined(SIMU)
extern "C" {
#include <CoOS.h>
}
#endif
#include "tasks_arm.h"
extern OS_MutexID mixerMutex;
inline void pauseMixerCalculations()
{
+2 -4
View File
@@ -330,7 +330,7 @@ void *main_thread(void *)
#endif
#if defined(CPUARM)
stack_paint();
stackPaint();
#endif
s_current_protocol[0] = 255;
@@ -657,12 +657,10 @@ void eepromWriteBlock(uint8_t * pointer_ram, uint32_t pointer_eeprom, uint32_t s
#endif
#if !defined(CPUARM)
uint16_t stack_free()
uint16_t stackAvailable()
{
return 500;
}
#endif
#if 0
static void EeFsDump(){
+67 -55
View File
@@ -36,10 +36,10 @@
#include "opentx.h"
#define MENUS_STACK_SIZE 2000
#define MIXER_STACK_SIZE 500
#define AUDIO_STACK_SIZE 500
#define BT_STACK_SIZE 500
#define MENUS_STACK_SIZE 2000
#define MIXER_STACK_SIZE 500
#define AUDIO_STACK_SIZE 500
#define BLUETOOTH_STACK_SIZE 500
#if defined(_MSC_VER)
#define _ALIGNED(x) __declspec(align(x))
@@ -48,73 +48,85 @@
#endif
OS_TID menusTaskId;
// stack must be aligned to 8 bytes otherwise printf for %f does not work!
OS_STK _ALIGNED(8) menusStack[MENUS_STACK_SIZE];
// menus stack must be aligned to 8 bytes otherwise printf for %f does not work!
TaskStack<MENUS_STACK_SIZE> _ALIGNED(8) menusStack;
OS_TID mixerTaskId;
OS_STK mixerStack[MIXER_STACK_SIZE];
TaskStack<MENUS_STACK_SIZE> mixerStack;
OS_TID audioTaskId;
OS_STK audioStack[AUDIO_STACK_SIZE];
TaskStack<AUDIO_STACK_SIZE> audioStack;
#if defined(BLUETOOTH)
OS_TID btTaskId;
OS_STK btStack[BT_STACK_SIZE];
TaskStack<BLUETOOTH_STACK_SIZE> bluetoothStack;
#endif
OS_MutexID audioMutex;
OS_MutexID mixerMutex;
void stack_paint()
enum TaskIndex {
MENU_TASK_INDEX,
MIXER_TASK_INDEX,
AUDIO_TASK_INDEX,
CLI_TASK_INDEX,
BLUETOOTH_TASK_INDEX,
TASK_INDEX_COUNT,
MAIN_TASK_INDEX = 255
};
template<int SIZE>
void TaskStack<SIZE>::paint()
{
for (uint32_t i=0; i<MENUS_STACK_SIZE; i++)
menusStack[i] = 0x55555555;
for (uint32_t i=0; i<MIXER_STACK_SIZE; i++)
mixerStack[i] = 0x55555555;
for (uint32_t i=0; i<AUDIO_STACK_SIZE; i++)
audioStack[i] = 0x55555555;
for (uint32_t i=0; i<SIZE; i++) {
stack[i] = 0x55555555;
}
}
uint32_t stack_free(uint32_t tid)
template<int SIZE>
uint16_t TaskStack<SIZE>::size()
{
OS_STK *stack;
uint32_t size;
return SIZE*4;
}
switch(tid) {
case 0:
stack = menusStack;
size = MENUS_STACK_SIZE;
break;
case 1:
stack = mixerStack;
size = MIXER_STACK_SIZE;
break;
case 2:
stack = audioStack;
size = AUDIO_STACK_SIZE;
break;
#if defined(PCBTARANIS)
case 255:
#if defined(SIMU)
return 1024;
#else
// main stack
stack = (OS_STK *)&_main_stack_start;
size = ((unsigned char *)&_estack - (unsigned char *)&_main_stack_start) / 4;
#endif
break;
#endif
default:
return 0;
uint16_t getStackAvailable(void * address, uint16_t size)
{
uint32_t * array = (uint32_t *)address;
uint16_t i = 0;
while (i < size && array[i] == 0x55555555) {
i++;
}
uint32_t i=0;
for (; i<size; i++)
if (stack[i] != 0x55555555)
break;
return i*4;
}
template<int SIZE>
uint16_t TaskStack<SIZE>::available()
{
return getStackAvailable(stack, SIZE);
}
void stackPaint()
{
menusStack.paint();
mixerStack.paint();
audioStack.paint();
#if defined(CLI)
cliStack.paint();
#endif
}
#if defined(CPUSTM32) && !defined(SIMU)
uint16_t stackSize()
{
return ((unsigned char *)&_estack - (unsigned char *)&_main_stack_start) / 4;
}
uint16_t stackAvailable()
{
return getStackAvailable(&_main_stack_start, stackSize());
}
#endif
#if !defined(SIMU)
void mixerTask(void * pdata)
@@ -176,7 +188,7 @@ void menusTask(void * pdata)
}
}
#if defined(REV9E)
#if defined(PCBTARANIS) && defined(REV9E)
topLcdOff();
#endif
@@ -204,12 +216,12 @@ void tasksStart()
#endif
#if defined(BLUETOOTH)
btTaskId = CoCreateTask(btTask, NULL, 15, &btStack[BT_STACK_SIZE-1], BT_STACK_SIZE);
btTaskId = CoCreateTask(btTask, NULL, 15, &bluetoothStack.stack[BLUETOOTH_STACK_SIZE-1], BLUETOOTH_STACK_SIZE);
#endif
mixerTaskId = CoCreateTask(mixerTask, NULL, 5, &mixerStack[MIXER_STACK_SIZE-1], MIXER_STACK_SIZE);
menusTaskId = CoCreateTask(menusTask, NULL, 10, &menusStack[MENUS_STACK_SIZE-1], MENUS_STACK_SIZE);
audioTaskId = CoCreateTask(audioTask, NULL, 7, &audioStack[AUDIO_STACK_SIZE-1], AUDIO_STACK_SIZE);
mixerTaskId = CoCreateTask(mixerTask, NULL, 5, &mixerStack.stack[MIXER_STACK_SIZE-1], MIXER_STACK_SIZE);
menusTaskId = CoCreateTask(menusTask, NULL, 10, &menusStack.stack[MENUS_STACK_SIZE-1], MENUS_STACK_SIZE);
audioTaskId = CoCreateTask(audioTask, NULL, 7, &audioStack.stack[AUDIO_STACK_SIZE-1], AUDIO_STACK_SIZE);
#if !defined(SIMU)
audioMutex = CoCreateMutex();
+61
View File
@@ -0,0 +1,61 @@
/*
* Authors (alphabetical order)
* - Andre Bernet <bernet.andre@gmail.com>
* - Andreas Weitl
* - Bertrand Songis <bsongis@gmail.com>
* - Bryan J. Rentoul (Gruvin) <gruvin@gmail.com>
* - Cameron Weeks <th9xer@gmail.com>
* - Erez Raviv
* - Gabriel Birkus
* - Jean-Pierre Parisy
* - Karl Szmutny
* - Michael Blandford
* - Michal Hlavinka
* - Pat Mackenzie
* - Philip Moss
* - Rob Thomson
* - Romolo Manfredini <romolo.manfredini@gmail.com>
* - Thomas Husterer
*
* opentx is based on code named
* gruvin9x by Bryan J. Rentoul: http://code.google.com/p/gruvin9x/,
* er9x by Erez Raviv: http://code.google.com/p/er9x/,
* and the original (and ongoing) project by
* Thomas Husterer, th9x: http://code.google.com/p/th9x/
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*/
#ifndef _TASKS_ARM_H_
#define _TASKS_ARM_H_
#if !defined(SIMU)
extern "C" {
#include <CoOS.h>
}
#endif
template<int SIZE>
class TaskStack
{
public:
TaskStack() { }
void paint();
uint16_t size();
uint16_t available();
OS_STK stack[SIZE];
};
void stackPaint();
uint16_t stackSize();
uint16_t stackAvailable();
#endif // _TASKS_ARM_H_