- 博客(48)
- 收藏
- 关注
原创 Linux用户与用户组
先来说说为什么要有用户用户组 加入有一台电脑,A,B,C,D四个人公用,当然他们不能同时使用。他们就相当于四个用户,每个人都要有自己的密码和用户名。如果AB是要用这台电脑学习,CD要用这台电脑打游戏,那么他们目的不一样。此时可以把他们分成两组学习组和游戏组。他们每个人都有自己要保存的东西,也有不想与别人分享的东西和想要分享的东西。所以都要把自己的文件加上权限,这样被人就可以不会改变自己的东西了。
2015-08-23 22:57:58 418
原创 程序是如何跑起来的
1.CPU内部结构解析 CPU所负责的就是解析和运行最终转换成机器语言的程序内容。 CPU的内部由寄存器,控制器,运算器和时钟四个部分组成 寄存器可以用来暂存指令,数据等处理对象,可以将其看作是内存的一种。 控制器负责把内存中的指令读入寄存器,并根据指令执行结果来控制计算机。 运算器负责运算内存读到寄存器中的数据。 时钟负责发出CPU开始计时的时钟信号寄存器中存储
2015-08-21 14:03:45 715
原创 C语言模拟鼠标事件
今天鼠标坏了,触摸板也被我禁止了,那叫一个纠结,我就上网查了一下能不能键盘控制鼠标,发现还真有。 先来看一个函数,据说已经被废弃的API函数VOID WINAPI mouse_event( _In_ DWORD dwFlags, _In_ DWORD dx, _In_ DWORD dy, _In_ DWORD dwData, _In_ ULONG
2015-07-19 22:47:40 13547 3
原创 STM32中的(bit-band)
今天再看STM32的位带操作,觉得还是有点意思的 STM32是32位的CPU所以操作都是直接操作32位数的如果想要操作bit级别的就需要映射,其实还是通过操作32位的别名区来进行位操作。这样呢, 1MB SRAM 就可以 32M 个对应别名区空间,就是 1 位膨胀到 32 位( 1bit 变为 1 个字);我们对这个别名区空间开始的某一字操作,置 0 或置 1,就等于它映射的 SRAM 或 I/O
2015-07-18 01:19:16 749
原创 volatile
今天再看volatile关键字,得到的一些看法 先来看一个有趣的例子 发薪资时,会计每次都把员工叫来登记他们的银行卡号;一次会计为了省事,没有即时登记,用了以前登记的银行卡号;刚好一个员工的银行卡丢了,已挂失该银行卡号;从而造成该员工领不到工资 员工 -- 原始变量地址 银行卡号 -- 原始变量在寄存器的备份首先volatile的意思为“直接存取原始内存地址,比如,volatile int
2015-07-14 23:14:36 351
原创 LCD5110
#ifndef _LCD_H#define _LCD_H#include <reg51.h>typedef unsigned char uint8_t;typedef unsigned short uint16_t;#define WIDTH 84#define HEIGHT 48sbit LCD_RST = P1^0; //RSTsbit LCD_CE = P1^1;
2015-07-08 22:44:49 833
原创 C#调用CMD
第一种返回命令执行后的结果,顺便加上解释static string StartCmd(string cmd){ if (cmd == string.Empty || cmd == "") return null; try { //实例化process对象 using (Process p = new Process()) {
2015-07-02 23:16:49 795
原创 STC不断电下载
STC每次烧录都要重新断开电源再次打开,十分麻烦,于是想要实现不断电下载。我们知道,STC单片机中有两个数据存储区,一个是固化好的ISP程序数据区,另一块是用户数据区。STC是通过ISP来下载。ISP的作用就是将上位机发送来的数据写到用户区,即将上位机发来的程序写到ROM中。stc启动分为两种一种是冷启动就是从断电在上电,另一种就是普通的复位启动。第一种启动是从单片机出场就固化好的ISP启动区来启动
2015-06-28 23:43:43 1214 1
原创 STC DATAFLASH 模拟EEPROM
今天在写STC的EEPROM,一直调不出来结果,但是还是很有收获的,放上代码,慰劳自己一天的努力,主要还是参考STC的开发手册#include <reg51.h>#include<intrins.h>//定义EEPROM的命令#define CMD_READ 0x01 #define CMD_WRITE 0x02#define CMD_ERASE 0x03//定
2015-06-27 04:17:35 1027
转载 Keil C51中的启动程序startup.a51最新中文说明!
由于CPU和程序启动代码文件STARTUP.a51的重要性,一些8051派生的CPU产品要求初始化CPU来满足设计中的相应的硬件,因此,有时候用户需要对STARTUP.a51进行修改,所以进行注释一下: ;————————————————— ;startup.A51: 用户上电初始化程序 ;—————————————————- ; ;使用以下EQU命令可定义在CPU复位时需要用0进行初始化
2015-06-26 13:13:15 3146
原创 CRC16计算
两个设备传输数据的时候需要校验数据是否准确,此时就需要校验码,校验通常有奇偶校验,和校验和CRC校验,这三种校验用的比较多,但是CRC校验是其中最准确的,因此我看了一下CRC校验的算法,下面是一些整理。首先说一下CRC校验的工作原理循环冗余校验码(CRC)的基本原理是:在K位信息码后再拼接R位的校验码,整个编码长度为N位,因此,这种编码也叫(N,K)码。对于一个给定的(N,K)码,可以证明存在一个最
2015-06-25 19:59:34 784
原创 Linux链表
#ifndef _LIST_H#define _LIST_H//定义链表的链接指针,前指针和后指针typedef struct list_head{ struct list_head *next; struct list_head *prev;}list_head;//获得链表头的地址#define LIST_HEAD_INIT(name){&(name),&(name)
2015-06-24 00:05:11 295
原创 获得数组大小
#include <stdio.h>#define GetArrayLen(array) sizeof(array) / sizeof(array[0])int main(){ char a[20]; int c = GetArrayLen(a); printf("%d",c); return 0;}
2015-06-23 14:57:31 294
原创 函数指针
为什么要用函数指针先来看看函数指针的形式返回值类型 ( * 指针变量名) ([形参列表]);如int (*Oper)(int,int);//定义一个指针变量,变量名为Oper,有两个输入参数,都为整型数,并且返回一个int结果我们知道指针是指向地址的变量,函数指针当然就是指向函数首地址的变量,也就是指向函数名。下面举一个例子//定义一个函数void Show(char* s){ prin
2015-06-23 14:11:44 295
原创 STM32 启动文件
先来看看启动代码中的伪操作和伪指令EQU 用于定义常量,相当于C中的宏定义 如Stack_Size EQU 0x00000400 ——— #define Stack_Size 0x00000400 ALIGN 字节对齐方式 ALIGN = 3 EXPORT 相当于声明了一个全局变量 EXPORT __Vectors
2015-06-17 23:35:28 406
原创 STM32 IAP
最近一直在看IAP的东西,总结了一写东西,但是具体的东西还没有尝试。先来说具体的问题 我想要的是可以通过无线来下载程序。思想是,首先在单片机中烧入一段程序,称之为bootloader,这段程序的目的是接收串口数据并且将数据写到flash指定的位置。但是现在我碰到了一些问题,首先是flash,不知道该如何操作,其次是如何从bootloader跳到APP。首先来说一下如何操作内部flashflash只
2015-06-17 20:18:22 612
原创 DMA介绍和几个问题
我学习DMA碰到的几个问题不了解什么是DMA 不知道DMA有什么优点 不知道什么时候使用DMA问题一 DMA简单的说就是数据的搬运工,将数据从外设搬到内存,或者将内存的一个位置搬运到另一个位置。只要开启了使能就开始搬运。问题二 既然DMA是数据的搬运工,那么CPU就可以不用管数据的搬运了,只要DMA一个信号说我搬完了,CPU进行数据处理就可以了。这样在数据搬运期间,CPU就可
2015-06-17 08:52:15 2629
原创 设置系统时间
首先引入 using System.Runtime.InteropServices;//dll引用时要用到的 using System.Text.RegularExpressions;//正则表达式匹配要用到的定义获得系统时间的结构体 [StructLayout(LayoutKind.Sequential)] public class wSystemTime {
2015-06-09 16:02:53 391
原创 C#双缓冲
private void Updata(){ Graphics g = pictureBox.CreateGraphics();//创建画布 BufferedGraphicsContext currentContext = BufferedGraphicsManager.Current;//创建缓冲区上下文 BufferedGraphics myBuffer = curre
2015-05-26 15:49:57 462
原创 LCD显示
今天在写LCD的显示,用的是51单片机和Proteus仿真,但是Proteus中没有以前写的LCD5110所以只能用库中的HDG12864F-1,后来才发现这个好像是写LCM的,搞了一晚上总算是弄出来了一下贴出代码每一个LCD驱动都要有命令和数据的写入首先是这两个代码//CE 片选信号//LCD_CE_OL 置低,表示选中芯片 //LCD_CE_OH 置高,表示未选中芯片/
2015-05-26 01:01:04 1177
原创 按键扫描
最近在做按键扫描,一直连按,最后发现是按键扫描程序有问题,做了一下修改并加上了注释uint8_t Key_Scan(uint8_t mode){ static uint8_t key_up = 1; //按键是否松开标志,为0按键按下,为1按键松开 if(mode) key_up = 1; //如果模式1,那么支持连按 if(key_up &&
2015-05-24 22:58:35 579
原创 单片机printf函数重定向
#include <reg51.h>#include <stdio.h>typedef char * va_list;//51单片机定义为char,如果是32位单片机就定义为int类型#define _INTSIZEOF(x) ((sizeof(x) + sizeof(char) - 1) & ~(sizeof(char) - 1) )#define va_start(ap,v) (ap =
2015-05-23 23:42:00 2138
转载 内存对齐
#define _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(int)-1))对于两个正整数 x, n 总存在整数 q, r 使得 x = n * q + r, 其中 0<= r <nq, r 是唯一确定的。 q = [x/n], r = x - n[x/n].这个是带余除法的一个简单形式。在 c 语言中, q, r 容易计
2015-05-23 11:56:48 301
转载 正则表达式
什么是正则表达式 从概念上来说,正则表达式也是一门小巧而精炼的语言,它可以用来简化检索特定的字符串,替换特定字符等功能,有许多开发语言工具,都内嵌支持正则表达式。那么一个正则表达式,究竟是什么?其实它就是一个字符串,但这个字符串具有特定含义。基础语法 字面值所谓字面值,就是没有任何转义,查找的对象就是其本身,比如正则表达式 abc ,查找的结果就是返回要查找字符串中 a, b, c三个字母连在一
2015-05-14 23:31:37 331
原创 C#实现毛玻璃效果
实现的原理是创建的窗体标题栏上是毛玻璃效果的,所以使用一个函数 void DwmExtendFrameIntoClientArea(IntPtr hwnd, ref MARGINS margins); 这个函数的作用就是从标题栏扩展到其他区域using System;using System.Collections.Generic;using System.ComponentModel;
2015-05-13 22:48:42 1839
转载 获取窗口句柄
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Wi
2015-05-13 09:17:52 570
原创 C#生产者消耗者
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Wi
2015-05-13 09:14:16 287
原创 获取本机IP
IPAddress hostIP = Dns.GetHostAddresses(Dns.GetHostName()).ToList().First(d => d.AddressFamily == AddressFamily.InterNetwork);
2015-05-13 08:50:44 272
转载 APM
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using S
2015-05-13 08:49:32 302
原创 lock
多线程访问同一个资源的时候需要用到锁,当一个线程锁定这个资源,其他线程需要等待它释放才能访问。using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text
2015-05-13 08:48:38 244
原创 C#调用CMD创建WIFI热点
//调用CMD public void CMD(string command) { try { Process cmd = new Process();//创建一个进程 cmd.StartInfo.FileName = "cmd.exe";//进程名,这个是必须有的 cmd.StartInfo.Arguments = "/c"
2015-05-13 08:37:42 696
原创 窗体通信
今天在写两个窗体间的通信,使用的是委托下面介绍一下自己的想法 比如有两个窗体A,B,A要给B发送信息(A->B),即在窗体A中改变数据,然后将数据传递给B。 想法是 在A中定义一个委托,在B中定义一个接受数据的方法,A中的委托绑定B中的接受数据的方法。那么,A中传递给B的数据,就可以通过委托传递给B。下面是一个自己写的例子,即在窗体B中的用户名和密码传递给A 上代码using System;
2015-05-05 22:13:29 321
原创 简单的跟踪算法
设两个物体间的X距离为Sx,Y距离为Sy 跟踪物体的X轴速度为Vx,Y轴速度为Vy 那么可以得到简单关系是 Vx / Vy = Sx / Sy; 不妨设 Vx = u * Sx; Vy = u * Sy; 即可得到跟踪的关系式。下面是一个简单例子,两个小球追击的例子class Ball { public Point m_Location = new Point(
2015-04-26 20:01:01 408
转载 远程线程技术
远程线程技术指的是通过在另一个进程中创建远程线程的方法进入那个进程的内存地址空间。我们知道,在进程中,可以通过CreateThread函数创建线程,被创建的新线程与主线程共享地址空间以及其他的资源。但是很少有人知道,通过CreateRemoteThread也同样可以在另一个进程内创建新线程,被创建的远程线程同样可以共享远程进程(是远程进程耶!)的地址空间,所以,实际上,我们通过一个远程线程,进入了远
2015-04-19 15:28:31 348
原创 Win32-DLL注入
Windows的常规的DLL注入为以下步骤 1.获得要注入的进程的句柄HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,//PROCESS_ALL_ACCESS为权限 FALSE,dwRemoteProcessId);//dwRemoteProcessId为进程的PID2.申请注入DLL的空
2015-04-19 15:14:13 520
原创 (delegate)BeginInvoke&EndInvoke
下面是我对BeginInvoke&EndInvoke的一点理解,作为一个记忆。 第一段代码是定义一个回调函数,第二段代码直接使用Lambada,还是Lambada方便啊 我先定义了一个委托,这个委托的内容是延时10秒钟,然后返回一个字符串,如果放在UI线程中就会有假死状态,所以使用委托的BeginInvoke,delegate.BeginInvoke的意思就是创建一个工作线程来执行委托函数,也就
2015-04-17 22:07:59 478
原创 跨线程的得到系统时间
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Wi
2015-04-17 12:22:10 313
原创 C#一些委托类型
C#中已经为我们定义了一些委托类型,我们就不需要自己定义了Func的委托 TResult表示返回的类型 Tx argx表示输入的参数 Func的委托可以没有输入的参数但是必须要有返回的类型(1) *delegate TResult Func<TResult>(); (2)*delegate TResult Func<T1,TResult>(T1 arg1);(3) *d
2015-04-17 11:52:58 321
原创 Lambada表达式简介
在我们程序中,经常有这样一些需求: 1. 需要一个临时方法,这个方法只会使用一次,或者使用的很少。 2. 这个方法的方法体很短,以至于比方法声明都短,写起来实在没劲(我将其称之为“一句话方法”)。匿名委托匿名方法使我们不需要创建具体的委托方法我们可以直接用匿名来定义委托方法例如: Action < string> p = delegate(string s)//定义一个委
2015-04-17 11:27:35 462
原创 C#异步跨线程
最近学习C#的异步操作,总是搞不明白什么意思,然后今天想自己写一下整理一下思路。 在窗体编程中,经常会碰到界面假死的状态,原因是什么呢?首先我们看一个造成假死的一个例子 我写了一个工程,目的是在点击开始按钮后progressBar.Value每隔10秒加一,然后richTextBox打印出来当前的progressBar.Value 部分代码如下 private void Upda
2015-04-17 11:20:59 475
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人