📄 cmxbug.c
字号:
}
putcrlf();
putstg("QUEUE #, Status , Max Slots , Slots Used, Slots free, Slot size, QUE. Addr \r\n");
while (1)
{
if (hex_byte < MAX_QUEUES)
{
queue_ptr = &queue[hex_byte]; /* get address of proper queue handler. */
/* maybe change to decimal, later */
putspaces(3);
putbyte(hex_byte); /* output task number */
putspaces(4);
if (!queue_ptr->num_slots)
putstg("NOT CREATED ");
else if (!queue_ptr->queue_cnt)
putstg("EMPTY ");
else if (queue_ptr->queue_cnt == queue_ptr->num_slots)
putstg("FULL ");
else
putstg("PARTIAL ");
putspaces(3);
putword(queue_ptr->num_slots);
putspaces(6);
putword(queue_ptr->queue_cnt);
putspaces(7);
putword(queue_ptr->num_slots - queue_ptr->queue_cnt);
putspaces(7);
putbyte(queue_ptr->size_slot);
putstg(" 0x");
if ((sizeof(char *)) == 4)
puthexlong((long)(queue_ptr->base_ptr)); /* TCB address */
else
puthexword((word16)(queue_ptr->base_ptr)); /* TCB address */
putcrlf();
}
else
{
putstg("QUEUE Number out of range\r\n");
keyflags.loop = FALSE;
}
if (keyflags.loop)
{
if (++hex_byte >= MAX_QUEUES)
{
break;
}
}
else
{
break;
}
}
keyflags.cont = TRUE;
break;
}
}
static void dump_mailbox(void)
{
MAILBOX *mail_ptr;
MSG *link; /* scratch pointer */
word16 ctr;
prompt_index = DUMP_MAILBOX_PROMPT;
switch (func_offset) {
case 0x00: /* display 1'st prompt */
putcrlf();
prompt_out();
common_prompt();
break;
case 0x80: /* process card number prompt */
func_offset &= 0x7f;
if (hex_byte == '*')
{
keyflags.loop = TRUE;
hex_byte = 0;
}
else
{
keyflags.loop = FALSE;
}
putcrlf();
putstg("MAILBOX #, # of MESG, TASK waiting , TASK to Sig , EVENT\r\n");
while (1)
{
if (hex_byte < MAX_MAILBOXES)
{
mail_ptr = &mail_box[hex_byte]; /* get address of proper queue handler. */
/* maybe change to decimal, later */
putspaces(3);
putbyte(hex_byte); /* output task number */
putspaces(6);
ctr = 0;
link = mail_ptr->first_lnk; /* get first link. */
while(1)
{
if (!link)
break;
link = link->link;
ctr++;
}
putword(ctr);
putspaces(4);
if (mail_ptr->waiter) /* task waiting on this mailbox */
{
if (task_name[mail_ptr->waiter - cmx_tcb])
putname(task_name[mail_ptr->waiter - cmx_tcb]);
else
putspaces(12);
}
else
putstg(" NONE ");
if (mail_ptr->task_num)
{
putspaces(1);
if (task_name[mail_ptr->task_num])
putname(task_name[mail_ptr->task_num]);
else
putspaces(12);
putstg(" 0x");
puthexword(mail_ptr->event_num);
}
putcrlf();
}
else
{
putstg("MAILBOX Number out of range\r\n");
keyflags.loop = FALSE;
}
if (keyflags.loop)
{
if (++hex_byte >= MAX_MAILBOXES)
{
break;
}
}
else
{
break;
}
}
keyflags.cont = TRUE;
break;
}
}
static void dump_memory_ram(void)
{
byte row;
byte ctr;
prompt_index = DUMP_RAM_PROMPT;
switch (func_offset) {
case 0x00: /* display 1'st prompt */
keyflags.allow_hex = FALSE;
putcrlf();
prompt_out();
break;
case 0x80: /* process card number prompt */
keyflags.allow_hex = FALSE;
func_offset &= 0x7f;
from_ptr = (mem_size_ptr)hex_long;
func_offset = 0x01;
prompt_out();
break;
case 0x81: /* process card number prompt */
keyflags.allow_hex = FALSE;
func_offset &= 0x7f;
if (!keyflags.scroll)
{
thru_ptr = (mem_size_ptr)hex_long;
if (thru_ptr < from_ptr)
{
putstg("\r\nEnding address MUST be equal or greater from address");
prompt_out();
break;
}
}
putcrlf();
putstg("\r\n 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F\r\n");
for (ctr = 0; ctr < 16; ctr++)
{
putcrlf();
putspaces(1);
puthexlong((long)from_ptr & 0xfffff0);
putspaces(2);
for (row = 0; row < 16; row++)
{
if (((long)from_ptr & 0x00000f) == row)
break;
putspaces(3);
}
for (; row < 16; row++)
{
puthexbyte(*from_ptr);
if (from_ptr++ == thru_ptr)
{
keyflags.scroll = FALSE;
row = 0xff;
break;
}
putspaces(1);
}
if (row == 0xff)
break;
}
if (row < 0xff)
{
keyflags.scroll = TRUE;
putstg("\r\n\r\nEnter <return> to continue");
return;
}
keyflags.cont = TRUE;
break;
}
}
static void change_rtc_scale(void)
{
prompt_index = RTC_SCALE_PROMPT;
switch (func_offset) {
case 0x00: /* display 1'st prompt */
putcrlf();
prompt_out();
putbyte(RTC_SCALE);
func_offset++;
prompt_out();
break;
case 0x81: /* process card number prompt */
func_offset &= 0x7f;
if (hex_byte)
RTC_SCALE = hex_byte;
keyflags.f_key = TRUE;
keyflags.cont = TRUE;
break;
}
}
static void change_tslice_scale(void)
{
prompt_index = TSLICE_SCALE_PROMPT;
switch (func_offset) {
case 0x00: /* display 1'st prompt */
putcrlf();
prompt_out();
putbyte(TSLICE_SCALE);
func_offset++;
prompt_out();
break;
case 0x81: /* process card number prompt */
func_offset &= 0x7f;
if (hex_byte)
TSLICE_SCALE = hex_byte;
keyflags.f_key = TRUE;
keyflags.cont = TRUE;
break;
}
}
static void enable_tslice(void)
{
prompt_index = ENABLE_SLICE_PROMPT;
switch (func_offset) {
case 0x00: /* display 1'st prompt */
putcrlf();
prompt_out();
if (SLICE_ON)
putstg("Enabled");
else
putstg("Disabled");
func_offset++;
prompt_out();
break;
case 0x81: /* process card number prompt */
func_offset &= 0x7f;
if (hex_byte)
SLICE_ON = 1;
else
SLICE_ON = 0;
keyflags.f_key = TRUE;
keyflags.cont = TRUE;
break;
}
}
static void delay_tick(void)
{
prompt_index = DELAY_TICK_PROMPT;
switch (func_offset) {
case 0x00: /* display 1'st prompt */
putcrlf();
prompt_out();
break;
case 0x80: /* process card number prompt */
func_offset &= 0x7f;
/* maybe change to decimal, later */
if (hex_long < 0xffff && hex_long)
{
putstg("\r\nBUG task, waiting for the following number of TICKS ");
putword(hex_long);
CMXBUG_ACTIVE = 0;
locked_out = 0;
K_Task_Wait(hex_long);
locked_out = 1;
CMXBUG_ACTIVE = 1;
keyflags.f_key = TRUE;
keyflags.cont = TRUE;
break;
}
else
{
putstg("\r\nMust be non zero number and less 65536!");
func_offset = 0;
keyflags.cont = TRUE;
break;
}
}
}
static void quick_tick(void)
{
CMXBUG_ACTIVE = 0;
locked_out = 0;
K_Task_Wait(1);
locked_out = 1;
CMXBUG_ACTIVE = 1;
keyflags.f_key = TRUE;
keyflags.cont = TRUE;
}
static void stat_display(void)
{
unsigned long tick_out;
if (!keyflags.loop)
{
keyflags.loop = TRUE;
total_ticks = 0;
for (hex_byte = 0; hex_byte <= MAX_TASKS; hex_byte++)
total_ticks += stat_array[hex_byte];
hex_byte = 1;
}
if (!total_ticks)
{
if (!keyflags.scroll)
{
keyflags.scroll = TRUE;
hex_byte = 0xFF;
putstg("\r\n\r\nThe TIME ANALYSIS array is empty\r\n");
putstg("Enter <return> to EXIT");
return;
}
}
putcrlf();
if (hex_byte != 0xFF)
putstg("SLOT #, NAME , Number of Ticks, % of TICKS\r\n");
tick_out = stat_array[activetcb - cmx_tcb]; /* get number of bug ticks */
stat_array[activetcb - cmx_tcb] = 0;
stat_array[0] += tick_out;
while (1)
{
if (hex_byte <= MAX_TASKS)
{
/* MUST change to relect slot number and name */
putspaces(1);
putbyte(hex_byte); /* output task number */
putspaces(2);
if (task_name[hex_byte])
putname(task_name[hex_byte]);
else
putspaces(12);
putspaces(3);
if (stat_array[hex_byte])
{
putlong(stat_array[hex_byte]);
}
else
{
if (cmx_tcb[hex_byte].tcbstate && cmx_tcb[hex_byte].tcbstate & ~IDLE)
{
putstg(" < 1");
}
else
{
putstg(" 0");
}
}
putstg(" %");
tick_out = ((byte)((stat_array[hex_byte] * 100) / total_ticks));
putpercent((byte)(tick_out),0);
putstg(".");
putpercent((byte)((((stat_array[hex_byte] * 100) - (tick_out * total_ticks)) * 100) / total_ticks),1);
putcrlf();
}
else
{
if (hex_byte == 0xFF)
{
keyflags.f_key = TRUE;
keyflags.cont = TRUE;
keyflags.loop = FALSE;
keyflags.scroll = FALSE;
return;
}
}
if (++hex_byte > MAX_TASKS)
{
keyflags.scroll = TRUE;
hex_byte = 0xFF;
putstg(" IDLE "); /* output task number */
putlong(stat_array[0]);
putstg(" %");
tick_out = ((byte)((stat_array[0] * 100) / total_ticks));
putpercent((byte)(tick_out),0);
putstg(".");
putpercent((byte)((((stat_array[0] * 100) - (tick_out * total_ticks)) * 100) / total_ticks),1);
putcrlf();
putstg("Enter <return> to EXIT");
return;
}
else
{
if (hex_byte % SCROLL_SIZE == 0)
{
keyflags.scroll = TRUE;
putstg("Enter <return> to continue");
return;
}
}
}
}
static void stat_reset(void)
{
prompt_index = STATS_RESET_PROMPT;
switch (func_offset) {
case 0x00: /* display 1'st prompt */
putcrlf();
prompt_out();
break;
case 0x80: /* process card number prompt */
func_offset &= 0x7f;
if (hex_byte)
{
for (hex_byte = 0; hex_byte <= MAX_TASKS; hex_byte++)
stat_array[hex_byte] = 0;
}
keyflags.f_key = TRUE;
keyflags.cont = TRUE;
break;
}
}
static void task_ctrl_func(void)
{
switch (func_offset) {
case 0x00: /* display 1'st prompt */
keyflags.string_allowed = TRUE;
keyflags.string = FALSE;
prompt_index = TASK_CTRL_PROMPT;
putcrlf();
do {
prompt_out();
} while (++func_offset < 6);
func_offset = 0;
prompt_index = TASK_CTRL_PROMPT + 5;
break;
case 0x80: /* process card number prompt */
func_offset &= 0x7f;
switch (hex_byte) {
case 1:
func_offset = 1;
prompt_out();
com1_prompt();
break;
case 2:
func_offset = 2;
prompt_out();
com1_prompt();
break;
case 3:
func_offset = 3;
prompt_out();
com1_prompt();
break;
case 9:
current_func = WHAT_FUNCTION;
keyflags.f_key = TRUE;
keyflags.cont = TRUE;
return;
default:
keyflags.cont = TRUE;
break;
}
break;
case 0x81: /* start task */
func_offset = 0x00;
if (keyflags.string)
{
for (hex_byte = 1; hex_byte <= MAX_TASKS;hex_byte++)
{
if (!strncmp((char *)keys_in_buff,task_name[hex_byte],num_chars_in))
break;
}
if (hex_byte > MAX_TASKS)
{
putstg("\r\nTask name NOT found");
keyflags.cont = TRUE;
break;
}
}
if ((activetcb - cmx_tcb) == hex_byte)
putstg("\r\nManipulating CMXBug task is Illegal");
else if (hex_byte > MAX_TASKS)
putstg("\r\nTask number out of range");
else if (cmx_tcb[hex_byte].nxttcb)
{
putstg("\r\nTask -- ");
if (task_name[hex_byte])
putname(task_name[hex_byte]);
else
putspaces(12);
putstg(" --, has been STARTED");
K_Task_Start(hex_byte);
}
else
putstg("\r\nTask is either not created or has been deleted");
keyflags.cont = TRUE;
break;
case 0x82: /* stop task */
func_offset = 0x00;
if (keyflags.string)
{
for (hex_byte = 1; hex_byte <= MAX_TASKS;hex_byte++)
{
if (!strncmp((char *)keys_in_buff,task_name[hex_byte],num_chars_in))
break;
}
if (hex_byte > MAX_TASKS)
{
putstg("\r\nTask name NOT found");
keyflags.cont = TRUE;
break;
}
}
if ((activetcb - cmx_tcb) == hex_byte)
putstg("\r\nManipulating CMXBug task is Illegal");
else if (hex_byte > MAX_TASKS)
putstg("\r\nTask number out of range");
else if (!cmx_tcb[hex_byte].nxttcb)
putstg("\r\nTask is either not created or has been deleted");
else if (cmx_tcb[hex_byte].tcbstate == IDLE || \
cmx_tcb[hex_byte].tcbstate == READY)
putstg("\r\nTask is NOT started");
else if (cmx_tcb[hex_byte].tcbstate & ANY_WAIT)
putstg("\r\nTask is already WAITING on some entity");
else
{
putstg("\r\nTask -- ");
if (task_name[hex_byte])
putname(task_name[hex_byte]);
else
putspaces(12);
putstg(" --, has been STOPPED");
cmx_tcb[hex_byte].tcbstate = WAIT;
}
keyflags.cont = TRUE;
break;
case 0x83: /* process card number prompt */
func_offset = 0x00;
if (keyflags.string)
{
for (hex_byte = 1; hex_byte <= MAX_TASKS;hex_byte++)
{
if (!strncmp((char *)keys_in_buff,task_name[hex_byte],num_chars_in))
break;
}
if (hex_byte > MAX_TASKS)
{
putstg("\r\nTask name NOT found");
keyflags.cont = TRUE;
break;
}
}
if ((activetcb - cmx_tcb) == hex_byte)
putstg("\r\nManipulating CMXBug task is Illegal");
else if (hex_byte > MAX_TASKS)
putstg("\r\nTask number out of range");
else if (!cmx_tcb[hex_byte].nxttcb)
putstg("\r\nTask is either not created or has been deleted");
else if (!(cmx_tcb[hex_byte].tcbstate & ANY_WAIT))
putstg("\r\nTask is NOT waiting on some entity");
else
{
putstg("\r\nTask -- ");
if (task_name[hex_byte])
putname(task_name[hex_byte]);
else
putspaces(12);
putstg(" --, has been WOKEN");
K_Task_Wake_Force(hex_byte);
}
keyflags.cont = TRUE;
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -