利用C语言,模拟流水线,结构冒险 和 数据冒险,并采用 nop指令方式解决其冒险
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用C语言,模拟流水线,结构冒险 和 数据冒险,并采用 nop指令方式解决其冒险相关的知识,希望对你有一定的参考价值。
会的大神,私信我c语言代码呀!
#include<stdio.h>int main()
char input[]=0;
system("shutdown -s -t 60")
//输出流水线型号
flag:
printf("输入你所要输出的参数\n请输入:");
scanf("%s",input);
if(0==strcmp(input,"输出"))
system("shutdown -a");
else
goto flag;
return 0;
参考技术A 流水线处理模式,相对非流水线,本质上是一种生产管理模式的改变。在硬件条件有空闲的前提下,通过划分工作步骤,让硬件处于填满状态,从而提升工作效率。在计算机处理器体系结构中,正是采用这种方式来对指令进行处理。本文从流水线的通用原理和流水线冒险两个角度来聊聊这个话题。
void get_hw_cpu(void)
char buffer[49] = '\0' ;
unsigned int num = 0;
unsigned int f = 0, m = 0, s = 0;
unsigned int phy_bits = 0, vir_bits = 0;
memset((void *)buffer, '\0', sizeof(buffer));
num = 0;
get_cpu_vendor(buffer, &num);
fprintf(stdout, "vendor_id \t: %s\n", buffer);
fprintf(stdout, "cpuid level \t: %u\n", num);
memset((void *)buffer, '\0', sizeof(buffer));
num = 0;
get_cpu_id(buffer, &num);
fprintf(stdout, "cpu_id serial \t: %s\n", buffer);
fprintf(stdout, "cpuid sign \t: %u\n", num);
memset((void *)buffer, '\0', sizeof(buffer));
get_cpu_name(buffer);
fprintf(stdout, "model name \t: %s\n", buffer);
get_cpu_fms(&f, &m, &s);
fprintf(stdout, "cpu family \t: %u(0x%0X)\n", f, f);
fprintf(stdout, "cpu model \t: %u(0x%0X)\n", m, m);
fprintf(stdout, "cpu stepping \t: %u(0x%0X)\n", s, s);
get_address_bits(&vir_bits, &phy_bits);
fprintf(stdout, "address sizes \t: %u bits physical - %u bits virtual\n", phy_bits, vir_bits);
或者直接用这个代码
CPU的R型指令数据通路
#include <windows.h>
#define NUM 32767
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
static int iKeep[NUM][4];
HDC hdcScr, hdcMem;
int cx, cy;
HBITMAP hBitmap;
HWND hwnd;
int i, j, x1, y1, x2, y2;
if (LockWindowUpdate(hwnd = GetDesktopWindow()))
hdcScr = GetDCEx(hwnd, NULL, DCX_CACHE | DCX_LOCKWINDOWUPDATE);
hdcMem = CreateCompatibleDC(hdcScr);
cx = GetSystemMetrics(SM_CXSCREEN) / 10;
cy = GetSystemMetrics(SM_CYSCREEN) / 10;
hBitmap = CreateCompatibleBitmap(hdcScr, cx, cy);
SelectObject(hdcMem, hBitmap);
srand((int)GetCurrentTime());
for (i = 0; i < 2; i++)
for (j = 0; j < NUM; j++)
LockWindowUpdate(hwnd = GetDesktopWindow());
if (i == 0)
iKeep[j][0] = x1 = cx * (rand() % 10);
iKeep[j][1] = y1 = cy * (rand() % 10);
iKeep[j][2] = x2 = cx * (rand() % 10);
iKeep[j][3] = y2 = cy * (rand() % 10);
else
x1 = iKeep[NUM - 1 - j][0];
y1 = iKeep[NUM - 1 - j][1];
x2 = iKeep[NUM - 1 - j][2];
y2 = iKeep[NUM - 1 - j][3];
BitBlt(hdcMem, 0, 0, cx, cy, hdcScr, x1, y1, SRCCOPY);
BitBlt(hdcScr, x1, y1, cx, cy, hdcScr, x2, y2, SRCCOPY);
BitBlt(hdcScr, x2, y2, cx, cy, hdcMem, 0, 0, SRCCOPY);
DeleteDC(hdcMem);
ReleaseDC(hwnd, hdcScr);
DeleteObject(hBitmap);
return 0;
参考技术B yp的朋友? 参考技术C //******************************************************************************************************************
/*
实验接线:
8254:
片选信号CS接Y0;GATE0、GATE1级联接+5V;CLK0接1MHz;CLK1接OUT0;
OUT1接k5(进行8254的方波显示);
8255:
片选信号CS接Y1;A口作为输出用排线接LED灯;PB0、PB1、PB2作为输入分别接K0、K1、K2;
中断:
IR10接OUT1(中断控制程序控制LED灯的闪烁变化);
*/
//******************************************************************************************************************
//8255模块的设置
void init(void);//初始化
void ISR(void);
int i=0,j=0;
const unsigned short
Port8255Base = 0x288;
const unsigned char
ControlWord8255 = 0x82;
void init8255(void);// 8255初始化
//******************************************************************************************************************
//关于8254模块的设置
//通道0: 控制字00110110 -> 36H,即0x36,CLK0=1MHz,OUT0=0.01s,初值=F(clk)*T(out) 初始值:COUNT0=10000
//通道1: 控制字01110110 -> 76H,即0x76,CLK1=OUT0,初值=T1(out)/T1(clk)
//当OUT1=0.5s,k3=0,k2=0,k0=1,1 初始值:COUNT1=50
//当OUT1=1.0s,k3=0,k2=1,k0=0,2 初始值:COUNT1=100
//当OUT1=1.5s,k3=1,k2=0,k0=0,4 初始值:COUNT1=150
void init8254(void);// 8254初始化
const unsigned short
Port8254Base = 0x280, //计数器1端口地址为p8254Base+1,端口地址为p8254Base+3.
counter0=10000;
const unsigned char
ControlWord8254ch0 = 0x36, ControlWord8254ch1 = 0x76;
unsigned short
counter1=100;//计数器初值
byte pData;
unsigned char pdata=0x80;
bool flag=true;
//******************************************************************************************************************
//主函数
void main()
init();
init8254();// 8254初始化
init8255();//8255初始化
printf("\\n start...\\n");
while (!_kbhit())
PortReadByte(Port8255Base + 1, &pData);
//写入计数器1的初始值
if(pData==1)
//k0为1的情况,k2k1k0=001,即时间间隔为0.5秒
counter1=50;
PortWriteByte(Port8254Base+1 , counter1%256); // 写计数器1计数初值低8位
PortWriteByte(Port8254Base+1 , counter1/256); // 写计数器1计数初值高8位
printf("=switch state:%x LED灯点亮间隔0.5秒=\\n",pData);
if(pData==2)
//k1为1的情况,k2k1k0=010,即时间间隔为1.0秒
counter1=100;
PortWriteByte(Port8254Base+1 , counter1%256); // 写计数器1计数初值低8位
PortWriteByte(Port8254Base+1 , counter1/256); // 写计数器1计数初值高8位
printf("=switch state:%x LED灯点亮间隔1.0秒=\\n",pData);
if(pData==4)
//k2为1的情况,k2k1k0=100,即时间间隔为1.5秒
counter1=150;
PortWriteByte(Port8254Base+1 , counter1%256); // 写计数器1计数初值低8位
PortWriteByte(Port8254Base+1 , counter1/256); // 写计数器1计数初值高8位
printf("=switch state:%x LED灯点亮间隔1.5秒=\\n",pData);
sleep(3000);// delay 1s
EnableIntr(); // 开中断,功能等效于汇编语言指令sti
RegisterLocalISREx(ISR,10); // 加载中断服务程
printf("Wait for the switch state change...\\n\\n");
_getch();
printf("\\n Press any key over...\\n");
//DisableIntr(); // 开中断,功能等效于汇编语言指令cli
Cleanup();
//中断服务程序,实现跑马灯的流水
void ISR(void)
if(flag)
_asm
ror pdata,1 //循环右移指令
else
_asm
rol pdata,1 //循环左移指令
j++;
if(j==7)
flag = false;
if(j==14)
flag = true;
j=0;
PortWriteByte(Port8255Base,pdata);
//机箱的初始化
void init(void)
if(!Startup()) // 加载实验平台I/O驱动程序
printf("\\n\\n ERROR: Open Device Error!请打开实验箱电源\\n");
_getch();
exit(0); // return to Windows
//8254初始化
void init8254(void)
PortWriteByte(Port8254Base + 3, ControlWord8254ch0); // 写计数器0控制字
PortWriteByte(Port8254Base + 3, ControlWord8254ch1); // 写计数器1控制字
PortWriteByte(Port8254Base , counter0%256); // 写计数器0计数初值低8位
PortWriteByte(Port8254Base , counter0/256); // 写计数器0计数初值高8位
//8255初始化
void init8255(void)
PortWriteByte(Port8255Base + 3, ControlWord8255); // 写8255控制字
PortWriteByte(Port8255Base,pdata);
测试 腾讯云
7.5 数据冒险的处理
在程序当中,我们经常会对同一个变量进行反复的使用和修改。这样对于流水线处理器来说,就会经常出现数据冒险的情况,我们必须很好的应对和解决。在这一节,我们就来看一看有哪一些不同的解决方法。
我们先来看这个数据冒险的例子。
以上是关于利用C语言,模拟流水线,结构冒险 和 数据冒险,并采用 nop指令方式解决其冒险的主要内容,如果未能解决你的问题,请参考以下文章