bit

手把手,嘴对嘴,讲解UCOSII嵌入式操作系统的任务调度策略(二)

北城以北 提交于 2020-02-25 20:07:21
继续…… if (ticks > 0u) { /* 延时参数是否为0 */ OS_ENTER_CRITICAL();            /* 禁止中断 */ y = OSTCBCur->OSTCBY; OSRdyTbl[y] &= (OS_PRIO)~OSTCBCur->OSTCBBitX; if (OSRdyTbl[y] == 0u) { OSRdyGrp &= (OS_PRIO)~OSTCBCur->OSTCBBitY; } OSTCBCur->OSTCBDly = ticks; OS_EXIT_CRITICAL();           /* 开启中断 */ OS_Sched(); } 在上一段代码中,出现了一个陌生的数组: OSRdyTbl[],跟踪这个变量可以找到它的定义,发现它仅仅是一个uint8型的数组,长度是8个。 可以明确的告诉大家,这个数组很重要,应该算是任务优先级调度核心参数之一,与下面那个参数OSRdyGrp 合起来便可以作为任务就绪表。 ※接下来需要讲UCOSII系统的任务优先级调度策略,这一段有些复杂,需要反复思考,查阅大量的资料。 UCOSII的优先级策略 UCOSII操作系统最大可以管理64个任务(255个的暂时不讨论),每个任务都有唯一的优先级,从0开始到64,数字越小优先级越高,越优先进行系统调用,为了方面管理和调度

TM4C123-Peripheral Driver Library

☆樱花仙子☆ 提交于 2020-02-25 00:42:06
本文主要是对TI的TivaWare™ Peripheral Driver Library USER’S GUIDE(spmu298d.pdf)文件的阅读摘录,是外设库的简介及对寄存器、库函数两种编程方式的认识。 本文重点是对支持寄存器访问方式的头文件中寄存器命名方式的理解。 一、外设库的简介 该库是一个访问外设的驱动集。 While they are not drivers in the pure operating system sense (that is, they do not have a common interface and do not connect into a global device driver infrastructure), they do provide a mechanism that makes it easy to use the device’s peripherals 虽然它们不是纯操作系统意义上的驱动,即它们没有统一的接口,不连接到全局设备驱动基础结构。 但它们的确使访问外设更加方便 Where possible, computations that can be performed at compile time are done there instead of at run time. 在编译时能完成的计算将在编译时完成 The

windbg命令详解

青春壹個敷衍的年華 提交于 2020-02-24 09:52:20
DLL 该扩展仅在内核模式下使用,即使它是在 Ext.dll 中的。 Windows NT 4.0 Ext.dll Windows 2000 Ext.dll Windows XP和之后 Ext.dll 注释 如果不提供参数,调试器会列出所有进程,以及时间和优先级统计。这和使用 !process @#Process 0 作为 CommandString 值一样。 To terminate execution at any point, press CTRL+BREAK (in WinDbg) or CTRL+C (in KD). 附加信息 关于进程的一般信息,查看 线程和进程 。进程操作和获取进程信息,查看 控制进程和线程 。 !for_each_thread !for_each_thread 扩展对目标机中每个线程执行一次指定的调试器命令。 语法 !for_each_thread [ " CommandString " ] !for_each_thread -? 参数 CommandString 指定要为每个线程执行的调试器命令。如果 CommandString 包括多条命令,则需要用分号( ; )分隔他们,并且将 CommandString 包含在引号(")中。如果 CommandString 被包含在引号中,则 CommandString 中的命令不能包含引号。在

Linux后门入侵检测

馋奶兔 提交于 2020-02-23 19:09:49
蛋疼啊,服务器被入侵成肉鸡了,发出大量SYN请求到某个网站!(瞬间有种被OOXX(强)(奸)的赶脚) 泪奔ING... 源起: Linux服务器日常检查,#ps aux 发现大量httpd进程,和往常情况不同(和以往多出好几倍),接着#top 一下,httpd名列前茅!(JJ Fly...) #netstat -anp 发现大量SYN_SENT,成肉鸡了!(瞬间有种被OOXX(强)(奸)的赶脚)! #cd / 转到根目录 #ll -a检查最近修改过的文件,发现/etc文件夹在前几天凌晨三点被修改过,#cd /etc #ll -a 检测是否存在root.kit 1.安装chkrootkit(不安装工具,手动检测,你会疯的) rootkit从浅显的层面来讲即一种具有自我隐蔽性的后门程序,它往往被入侵者作为一种入侵工具。通过rootkit,入侵者可以偷偷控制被入侵的电脑,因此危害巨大。chkrootkit是一个Linux系统下的查找检测rootkit后门的工具。 安装方法 1、准备gcc编译环境 对于CentOS系统,执行下述三条命令: yum -y install gcc yum -y install gcc-c++ yum -y install make 对于debian系统,执行下述两条命令: apt-get -y install gcc apt-get -y install

【省选模拟测试3】

纵饮孤独 提交于 2020-02-14 02:44:04
                T1 题目: 【题目描述】 现有给定一个序列a_0,a_1,.....a_(n-1)共n项以及m个操作。操作分成以下三类: 0: 将区间[l,r]中的数加上一个值x 1: 将区间[l,r]中的数乘上-1 2: 询问区间[l,r]中的数的绝对值之和 编程实现以上操作。 【输入格式】 第一行两个数n,m,分别表示序列的长度和操作的个数 第二行n个数,第i个数表示a_(i-1) 第三至m+2行,每行采取下列形式之一: 0 l r x (表示第0种操作) 1 l r (表示第1种操作) 2 l r (表示第2种操作) l,r,x意义如题目描述中所述。 【输出格式】 共k行(其中k是第2种操作的个数),第i行有且仅有一个数,表示第i次第2种操作的答案。 【样例输入】 4 4 -2 -1 0 1 2 0 3 1 1 3 0 0 1 2 2 0 2 【样例输出】 4 3 【时空限制与数据约束】 时间:3s 空间:256MB 对于40%的数据,n,m<=10000 对于100%的数据,n,m<=100000 数据保证所有时刻序列中的数的绝对值总和不会超过64位有符号整形范围。 题解:   乍一看以为是水题……写了一个多小时Seg套Splay发现调不出来……oh,fxxk!然后就mengbier了= =。   zyf大佬使用吉司机线段树思想?(这是什么?)  

BZOJ5495 [2019省队联测]异或粽子

北城余情 提交于 2020-02-12 14:33:09
题意: 给定一个序列,问最大的k段连续异或和的代数和。 知识点: 可持久化Trie,堆 解法: 首先异或的一个性质可以把连续子串转化成前缀和的形式维护。 然后看到异或代数和最大,可以想到可持久化Trie。 但是维护的方法又有两种。 第一种也是我一开始想到的,把n个值最大的放到堆中,每次从堆中取出一个元素,更新答案;然后找出这个元素唯一对应的下一个值(暴力跳trie,最多不超过64次)。但是太难了。 第二种就是超级钢琴的做法,在l到r中找到最大的答案为pos点,然后放入l到pos-1和pos-1到r继续更新答案即可。 备注: 这种超级钢琴的做法很值得学习。注意这道题堆里面要维护的是l,r,pos,val,id,id不可以省。 代码: #include<cstdio> #include<cstring> #include<queue> using namespace std; typedef long long ll; const int maxn=500010; int n,m,tot,bit[35],rt[maxn]; ll ans,sum[maxn]; struct trie { int ch[2],tag,id; }a[maxn*40]; struct data { int l,r; ll val; int pos,id; bool operator <(const data

位图bitmap数据结构

谁都会走 提交于 2020-02-10 21:51:37
位图是一种很特殊的数据结构,可以利用位图来排序,但是这种排序方法对输入的数据是有比较严格的要求(数据不能重复,大致知道数据的范围)。举个例子,假如有一个集合{3,5,7,8,2,1},我们可以用一个8位的二进制向量set[1-8]来表示该集合,如果数据存在,则将set相对应的二进制位置1,否则置0.根据给出的集合得到的set为{1,1,1,0,1,0,1,1},然后再根据set集合的值输出对应的下标即可得到集合{3,5,7,8,2,1}的排序结果。 位图的应用: 1.给40亿个不重复的unsigned int的整数,没有排过序,然后再给一个数,如果快速判断这个数是否在那40亿个数当中。 因为unsigned int数据的最大范围在在40亿左右,40 10^8/1024 1024*8=476,因此只需申请512M的内存空间,每个bit位表示一个unsigned int。读入40亿个数,并设置相应的bit位为1.然后读取要查询的数,查看该bit是否为1,是1则存在,否则不存在。 2.给40亿个unsigned int的整数,如何判断这40亿个数中哪些数重复? 同理,可以申请512M的内存空间,然后读取40亿个整数,并且将相应的bit位置1。如果是第一次读取某个数据,则在将该bit位置1之前,此bit位必定是0;如果是第二次读取该数据,则可根据相应的bit位是否为1判断该数据是否重复。

Reids之缓存雪崩、缓存穿透

与世无争的帅哥 提交于 2020-02-10 14:12:29
1、缓存雪崩 缓存雪崩指的是原有的缓存数据出现了大批量的缓存过期,造成一时间大批量并发请求都到了数据库,造成数据库的压力激增,严重的会造成数据库宕机。从而形成一系列连锁反应,造成整个系统崩溃。 【解决方案】 从上面的分析可以看出只有当缓存同时大批量过期的时候,才会出现缓存雪崩的情形,所以只要想办法让缓存过期的时间分散开来即可。那方法就多了,比如说将热数据的缓存时间设置长一点,冷数据的过期时间设置得短一点,另外数据也可以分类设置不同的过期时间,或者加一个随机扰乱因子。 2、缓存穿透 缓存穿透是指查询一个不存在于缓存且不存在于数据库的数据,这时如果遭到恶意攻击,频繁地请求这个缺失数据,必然会每次都要读缓存和读数据库,增加了数据库的压力负担。 【解决方案】 对于缺失的数据,每次请求完数据库之后,都要更新到缓存,设置其key对应的value为空即可。这样当下一次请求该缺失数据对应的key,就可以直接通过缓存判断了,不需要再去请求数据库。 ——缺点:显然,当数据缺失很多的时候,必然会极大地浪费缓存的内存空间。 采取bloom filter(布隆过滤器),布隆过滤器的原理如下。 3、布隆过滤器 首先明确我们要解决的问题,即如何快速判断一个数据是否存在于数据库中。那我们自然而然想到的便是采取hash思想,只需要将数据库中的所有数据key存储到一个hash结构中,便可以快速判断

AVR单片机教程——DAC

烈酒焚心 提交于 2020-02-08 22:49:21
本文隶属于 AVR单片机教程 系列。 单片机的应用场景时常涉及到模拟信号。我们已经会使用ADC把模拟信号转换成数字信号,本讲中我们要学习使用DAC把数字信号转换成模拟信号。我们还将搭建一个简单的功率放大器电路,用DAC通过扬声器播放音乐。 SPI总线 集成DAC的单片机不多,ATmega系列就不在此列。我们将要使用的10位ADC是通过SPI总线通信的,因此我们先来学习SPI总线。 SPI是一种同步串行通信总线,支持全双工通信。所谓同步,就是有时钟信号,类似上一讲中的595和165,并且硬件实现上相似;所谓全双工,就是收发可以同时进行,事实上SPI的收发是必须同时进行的,不过你可以有选择地忽略其中一个。 一次SPI通信涉及到两个设备,分别是主机和从机。区分主机和从机的标准并不是发送方是主机,而是发起方是主机。形象地说,我让你给我一个苹果,尽管你是发送方,但我是发起方,因此我是主机。 SPI有4根信号线:主发从收 MOSI 、主收从发 MISO 、时钟 SCK 、片选 SS (以下省略上划线)。主机和从机的 MOSI 、 MISO 、 SCK 一般直接连接,根据应用需要可以省去 MOSI 或 MISO ,从机的 SS 可以连接主机的任意引脚,因为 SS 上的信号极其简单。 两个以上的设备也可以通过SPI通信,连接方式是 MOSI 、 MISO 、 SCK 直接连接