⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cmxbug.c

📁 上传一个带源代码的嵌入式实时多任务操作系统CMX
💻 C
📖 第 1 页 / 共 3 页
字号:
				}
			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 + -