写好的C代码怎样变成软件
展开全部 程序首先需要编译,然后连接形成可执行文件。
以 Clang 编译器为例。
首先,创建 main.c 文件: #include "printnum.h"int main(){ int num = 42; printnum(num); return 0;}然后,创建 printnum.h 文件: #pragma oncevoid printnum(int num);其中,#pragma once 告诉编译器这个头文件不要重复包含。
接下来,创建 printnum.c 文件,实现 printnum 函数: #include void printnum(int num){ printf("%d\n", num);}现在,文件夹里有两个源文件:main.c 和 printnum.c。
然后我们打开命令行。
先编译源文件 main.c,生成 main.o: clang -c main.c -o main.o再编译源文件 printnum.c,生成 printnum.o: clang -c printnum.c -o printnum.o最后将 main.o 与 printnum.o 连接生成 main.exe: clang main.o printnum.o -o main.exe运行 main.exe,输出 42,成功。
...
看门狗复位指令怎么用?
在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成整个系统的陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的芯片,俗称"看门狗"(watchdog) 看门狗电路的应用,使单片机可以在无人状态下实现连续工作,其工作原理是:看门狗芯片和单片机的一个I/O引脚相连,该I/O引脚通过程序控制它定时地往看门狗的这个引脚上送入高电平(或低电平),这一程序语句是分散地放在单片机其他控制语句中间的,一旦单片机由于干扰造成程序跑飞后而陷入某一程序段 进入死循环状态时,写看门狗引脚的程序便不能被执行,这个时候,看门狗电路就会由于得不到单片机送来的信号,便在它和单片机复位引脚相连的引脚上送出一个复位信号,使单片机发生复位,即程序从程序存储器的起始位置开始执行,这样便实现了单片机的自动复位. 看门狗,又叫 watchdog timer,是一个定时器电路, 一般有一个输入,叫喂狗(kicking the dog or service the dog),一个输出到MCU的RST端,MCU正常工作的时候,每隔一端时间输出一个信号到喂狗端,给 WDT 清零,如果超过规定的时间不喂狗,(一般在程序跑飞时),WDT 定时超过,就回给出一个复位信号到MCU,是MCU复位. 防止MCU死机. 看门狗的作用就是防止程序发生死循环,或者说程序跑飞。
工作原理:在系统运行以后也就启动了看门狗的计数器,看门狗就开始自动计数,如果到了一定的时间还不去清看门狗,那么看门狗计数器就会溢出从而引起看门狗中断,造成系统复位。
所以在使用有看门狗的芯片时要注意清看门狗。
硬件看门狗是利用了一个定时器,来监控主程序的运行,也就是说在主程序的运行过程中,我们要在定时时间到之前对定时器进行复位如果出现死循环,或者说PC指针不能回来。
那么定时时间到后就会使单片机复位。
常用的WDT芯片如MAX813 ,5045, IMP 813等,价格4~10元不等. 软件看门狗技术的原理和这差不多,只不过是用软件的方法实现,我们还是以51系列来讲,我们知道在51单片机中有两个定时器,我们就可以用这两个定时器来对主程序的运行进行监控。
我们可以对T0设定一定的定时时间,当产生定时中断的时候对一个变量进行赋值,而这个变量在主程序运行的开始已经有了一个初值,在这里我们要设定的定时值要小于主程序的运行时间,这样在主程序的尾部对变量的值进行判断,如果值发生了预期的变化,就说明T0中断正常,如果没有发生变化则使程序复位。
对于T1我们用来监控主程序的运行,我们给T1设定一定的定时时间,在主程序中对其进行复位,如果不能在一定的时间里对其进行复位,T1 的定时中断就会使单片机复位。
在这里T1的定时时间要设的大于主程序的运行时间,给主程序留有一定的的裕量。
而T1的中断正常与否我们再由T0定时中断子程序来监视。
这样就够成了一个循环,T0监视T1,T1监视主程序,主程序又来监视T0,从而保证系统的稳定运行。
51 系列有专门的看门狗定时器,对系统频率进行分频计数,定时器溢出时,将引起复位.看门狗可设定溢出率,也可单独用来作为定时器使用. 凌阳61的看门狗比较单一,一个是时间单一,第二是功能在实际的使用中只需在循环当中加入清狗的指令就OK了。
C8051Fxxx单片机内部也有一个21位的使用系统时钟的定时器,该定时器检测对其控制 寄存器的两次特定写操作的时间间隔。
如果这个时间间隔超过了编程的极限值,将产生一个WDT复位。
-------------------------------------------------------------------------------- 看门狗使用注意:大多数51 系列单片机都有看门狗,当看门狗没有被定时清零时,将引起复位。
这可防止程序跑飞。
设计者必须清楚看门狗的溢出时间以决定在合适的时候,清看门狗。
清看门狗也不能太过频繁否则会造成资源浪费。
程序正常运行时,软件每隔一定的时间(小于定时器的溢出周期)给定时器置数,即可预防溢出中断而引起的误复位。
看门狗运用:看门狗是恢复系统的正常运行及有效的监视管理器(具有锁定光驱,锁定任何指定程序的作用,可用在家庭中防止小孩无节制地玩游戏、上网、看录像)等具有很好的应用价值. 系统软件"看门狗"的设计思路: 1.看门狗定时器T0的设置。
在初始化程序块中设置T0的工作方式,并开启中断和计数功能。
系统Fosc=12 MHz,T0为16位计数器,最大计数值为(2的16次方)-1=65 535,T0输入计数频率是.Fosc/12,溢出周期为(65 535+1)/1=65 536(μs)。
2.计算主控程序循环一次的耗时。
考虑系统各功能模块及其循环次数,本系统主控制程序的运行时间约为16.6 ms。
系统设置"看门狗"定时器T0定时30 ms(T0的初值为65 536-30 000=35 536)。
主控程序的每次循环都将刷新T0的初值。
如程序进入"死循环"而T0的初值在30 ms内未被刷新,这时"看门狗"定时器T0将溢出并申请中断。
3.设计T0溢出所对应的中断服务程序。
此子程序只须一条指令,即在T0对...
有什么软件自动给C语言代码 调整格式
1:最好将拷一个cstartup.s43,把只读属性去掉,一定要加载到用户自己的项目工程中,文件开头加上 #define DISABLE_WATCHDOG 就行了。
2:在Project->Options->Linker->Config页中选择Override default programe ,并将Entry symb 设置 成 __program_start。
3:把debugger->setup->Run to main销掉,目的只是为了单步调试时看的更清楚。
4:调试一下。
求C语言链表的 添加查找删除插入输出 等操作的代码范例
代码:#include #include #define LIST_INIT_SIZE 80 /*线性表存储空间的初始分配量*/#define LISTINCREMENT 10 /* 线性表存储空间的分配增量*/#define ElemType int#define OVERFLOW -2 typedef struct{ //链表类型//Link head, tail; //分别指向线性表中的头结点和最后一个结点int length,listsize;ElemType *elem;//指示线性链表中数据元素的个数}LinkList;enum status {OK=1,ERROR};typedef int Status;void insertruction (void);Status InitList_L(LinkList &L); //构造一个空的线性链表Status ListInsert_L(LinkList &L,int i,ElemType);//在带头结点的单链线性表L的第i个元素插入元素eStatus ListDelete_L(LinkList &L,int i,ElemType &e);//在带头结点的单链线线性表L中,删除第i个元素,并由其他值返回其值int LocateElem_L(LinkList,ElemType);Status (*compare)(ElemType,ElemType);//在静态单链线性表L中查找元素void printList(LinkList &L);//void DestroyList_Link(LinkList);//销毁线性链表L,L不再存在main (){LinkList myLinkList;int choice;int item;ElemType deleted_value;int loc;if (InitList_L(myLinkList)!=1) return 0;insertruction ();/*显示菜单*/printf ("?");scanf ("%d",&choice);while (choice!=4){switch(choice){case 1:printf("Enter tow integer:");scanf("/n%d%d",&loc,&item);if (ListInsert_L(myLinkList,loc,item)==1)printf("ListInsert ok/n");elseprintf("ListInsert error/n");printList(myLinkList);break;case 2:printf("Enter an integer(location):");scanf("/n%d",&loc);if (ListDelete_L(myLinkList,loc,deleted_value)==1)printf("ListDelete is %d/n",deleted_value);elseprintf("ListDelete error/n");printList(myLinkList);break;case 3:printf("Enter a value to be finded:");scanf("/n%d",&item);if (LocateElem_L(myLinkList,item)==0)printf("not find %d./n",item);elseprintf("%d is locate %d./n",item,LocateElem_L(myLinkList,item));break;default:printf("Invalid choice./n/n");insertruction ();break;}printf("?");scanf("%d",&choice);}DestroyList_Link(myLinkList);printf("End of run./n");return 0; }void insertruction (void){printf("Enter your choice: /n""1 to insert an element into the LinkList. /n""2 to delete an element into the LinkList. /n""3 to find an element in the LinkList. /n""4 to end./n");}Status InitList_L(LinkList &L) {// 构造一个空的线性表L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));if (!L.elem){printf("Linklist not Init. No memory available./n");exit(OVERFLOW);}L.length=0;L.listsize=LIST_INIT_SIZE;return OK;} // InitList_Linkint LocateElem_L(LinkList L, ElemType e){// 在顺序表中查询第一个满足判定条件的数据元素,// 若存在,则返回它的位序,否则返回 0ElemType i,*p;i=1; // i 的初值为第 1 元素的位序p=L.elem; // p 的初值为第 1 元素的存储位置//i=S[0].cur;while(iL.length+1) return ERROR;/* 插入位置不合法*/if (L.length>=L.listsize) {// 当前存储空间已满,增加分配newbase= (ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));if (!newbase) exit(OVERFLOW);// 存储分配失败L.elem=newbase;// 新基址L.listsize += LISTINCREMENT; // 增加存储容量}q=&(L.elem[i-1]); // q 指示插入位置for(p= &(L.elem[L.length-1]); p>=q;--p)*(p+1)=*p; // 插入位置及之后的元素右移*q=e; // 插入e++L.length; // 表长增1return OK;}// ListInsert_LinkStatus ListDelete_L(LinkList &L, int i, ElemType &e) {ElemType *p, *q;if ((iL.length)) return ERROR; // 删除位置不合法p=&(L.elem[i-1]); // p 为被删除元素的位置e=*p; // 被删除元素的值赋给 eq=L.elem+L.length-1; // 表尾元素的位置for (++p;p0){printf ("LinkList is: ");/*for (k=0;klength;k++){q=&(L->elem[k]);printf("%d,",*q);}printf("/n");*/for (q=L.elem;q<L.elem+L.length;q++){printf("%d,",*q);}printf("/n");}elseprintf ("List is empty./n/n");} void DestroyList_Link(LinkList L){//free(L.elem);L.listsize=0;L.length=0;free(L.elem);}//DestroyList_Link
c primer plus(6)第三章第一个示例程序出现C4996代码
你是c语言的初学者吗?你意思是你编的dos那种界面,想换成windows界面,那你就要在vc6里面新建MFC appwisard 下面给你一个用c++语言生成一个简单的点击弹出对话框示例代码:用c语言写界面实在太麻烦了,太难了。
如果你没有学过c++,那我给你个最实际的办法,你在vc里面把你的代码生成dll,然后在vb里面调用。
vb很容易做windows界面这是众所周知的。
#include #include #include LRESULT CALLBACK MainWndProc (HWND hwnd, UINT nMsg, WPARAM wParam, LPARAM lParam) {/* The window handle for the "Click Me" button. */ static HWND hwndButton = 0; static int cx, cy;/* Height and width of our button. */ HDC hdc;/* A device context used for drawing */ PAINTSTRUCT ps;/* Also used during window drawing */ RECT rc;/* A rectangle used during drawing */ switch (nMsg) { case WM_CREATE:{ TEXTMETRIC tm; hdc = GetDC (hwnd); SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)); GetTextMetrics (hdc, &tm); cx = tm.tmAveCharWidth * 30; cy = (tm.tmHeight + tm.tmExternalLeading) * 2; ReleaseDC (hwnd, hdc);/* Now create the button */ hwndButton = CreateWindow ("button",/* Builtin button class */"Click Here",WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,0, 0, cx, cy,hwnd,/* Parent is this window. */(HMENU) 1,/* Control ID: 1 */((LPCREATESTRUCT) lParam)->hInstance,NULL); return 0; break; } case WM_DESTROY:PostQuitMessage (0); return 0; break; case WM_PAINT:hdc = BeginPaint (hwnd, &ps); GetClientRect (hwnd, &rc); rc.bottom = rc.bottom / 2; DrawText (hdc, "Hello, World!", -1, &rc,DT_SINGLELINE | DT_CENTER | DT_VCENTER); EndPaint (hwnd, &ps); return 0; break; case WM_SIZE:if (hwndButton &&(wParam == SIZEFULLSCREEN || wParam == SIZENORMAL) ) { rc.left = (LOWORD(lParam) - cx) / 2; rc.top = HIWORD(lParam) * 3 / 4 - cy / 2; MoveWindow ( hwndButton,rc.left, rc.top, cx, cy, TRUE); } break; case WM_COMMAND:if (LOWORD(wParam) == 1 && HIWORD(wParam) == BN_CLICKED && (HWND) lParam == hwndButton) { DestroyWindow (hwnd); } return 0; break; } return DefWindowProc (hwnd, nMsg, wParam, lParam); } int STDCALL; WinMain (HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmd, int nShow) { HWND hwndMain;/* Handle for the main window. */ MSG msg;/* A Win32 message structure. */ WNDCLASSEX wndclass;/* A window class structure. */ char*szMainWndClass = "WinTestWin"; memset (&wndclass, 0, sizeof(WNDCLASSEX)); wndclass.lpszClassName = szMainWndClass; wndclass.cbSize = sizeof(WNDCLASSEX); wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = MainWndProc; wndclass.hInstance = hInst; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION); wndclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION); wndclass.hCursor = LoadCursor (NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH); RegisterClassEx (&wndclass); hwndMain = CreateWindow ( szMainWndClass,/* Class name */"Hello",/* Caption */ WS_OVERLAPPEDWINDOW,/* Style */ CW_USEDEFAULT,/* Initial x (use default) */ CW_USEDEFAULT,/* Initial y (use default) */ CW_USEDEFAULT,/* Initial x size (use default) */ CW_USEDEFAULT,/* Initial y size (use default) */ NULL,/* No parent window */ NULL,/* No menu */ hInst,/* This program instance */ NULL/* Creation parameters */); ShowWindow (hwndMain, nShow); UpdateWindow (hwndMain); while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg); DispatchMessage (&msg); } return msg.wParam; }
转载请注明出处51数据库 » 软件看门狗c代码范例
南宫玉儿__