<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[不走寻常路]]></title><description><![CDATA[放过了自己才能高飞]]></description><link>https://blog.youkuaiyun.com/sining87</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; sining87]]></copyright><item><title><![CDATA[verilog编程，可能你一直在错误地使用计数器cnt]]></title><link>https://blog.youkuaiyun.com/sining87/article/details/79132826</link><guid>https://blog.youkuaiyun.com/sining87/article/details/79132826</guid><author>sining87</author><pubDate>Mon, 22 Jan 2018 20:12:21 +0800</pubDate><description><![CDATA[计数器是verilog编程中非常常用的一种技巧，但是我们如果是C等语言的编程思维则极有可能错误地使用计数器。下面举个例子：
module delay (
	input clk_sys,  //系统时钟
	input rst_n,
	output reg [31:0] time_cnt         
);
parameter DELAY_TIME = 32'd50； //计数总时钟个数
reg]]></description><category></category></item><item><title><![CDATA[verilog编程，请把时序逻辑和组合逻辑彻底分开！]]></title><link>https://blog.youkuaiyun.com/sining87/article/details/79129271</link><guid>https://blog.youkuaiyun.com/sining87/article/details/79129271</guid><author>sining87</author><pubDate>Mon, 22 Jan 2018 15:24:53 +0800</pubDate><description><![CDATA[以一个同步加法器为例，使用verilog实现：

module adder(
	input clk_sys,
	input rst_n,

	input a,
	input b,

	output reg c
);
always @(posedge clk_sys or negedge rst_n) begin
	if(!rst_n) 
		c <= 0;
	else 
		c <= a+b;]]></description><category></category></item><item><title><![CDATA[CMSIS-RTOS 交汇Rendezvous]]></title><link>https://blog.youkuaiyun.com/sining87/article/details/53245071</link><guid>https://blog.youkuaiyun.com/sining87/article/details/53245071</guid><author>sining87</author><pubDate>Sun, 20 Nov 2016 21:54:03 +0800</pubDate><description><![CDATA[交汇Rendezvous一种更常规的信号量通信形式叫做交汇，交汇确保两个线程同时到达某个确定的执行点，除非两个线程都到达这个交汇点，否则它们都不会继续运行。osSemaphore arrived1, arrived2;
osSemaphoreDef(arrived1);
osSemaphoreDef(arrived2);void thread1(void){
    Arrived1 = osSem]]></description><category></category></item><item><title><![CDATA[CMSIS-RTOS 复用Multiplex]]></title><link>https://blog.youkuaiyun.com/sining87/article/details/53245046</link><guid>https://blog.youkuaiyun.com/sining87/article/details/53245046</guid><author>sining87</author><pubDate>Sun, 20 Nov 2016 21:52:37 +0800</pubDate><description><![CDATA[复用Multiplex复用是用来限制访问临界代码区的线程个数，举个例子，对于存储空间的访问仅仅可能只支持几个受限的调用。osSemaphoreId multiplex;
osSemaphoreDef(multiplex);
void thread1 (void)
{
    multiplex =osSemaphoreCreate(osSemaphore(multiplex), FIVE_TOKEN]]></description><category></category></item><item><title><![CDATA[CMSIS-RTOS 信号量的使用Using Semaphores]]></title><link>https://blog.youkuaiyun.com/sining87/article/details/53245011</link><guid>https://blog.youkuaiyun.com/sining87/article/details/53245011</guid><author>sining87</author><pubDate>Sun, 20 Nov 2016 21:50:30 +0800</pubDate><description><![CDATA[信号量的使用Using Semaphores前面说过信号量包含较多的OS调用，所以它拥有广泛的同步应用，这也就导致了它可能是RTOS里面最难理解的部分。在本节，我们将看看信号量的一些普遍应用，这些应用摘自“信号量小书”（Allen B. Downey著），这本书可以免费下载，链接在本书的最后部分。发送信号Signaling两个线程之间的同步是信号量最简单的使用方式：osSemaphoreId sem]]></description><category></category></item><item><title><![CDATA[CMSIS-RTOS 信号量Semaphores]]></title><link>https://blog.youkuaiyun.com/sining87/article/details/53244364</link><guid>https://blog.youkuaiyun.com/sining87/article/details/53244364</guid><author>sining87</author><pubDate>Sun, 20 Nov 2016 20:40:06 +0800</pubDate><description><![CDATA[信号量Semaphores和信号类似，信号量也是一种同步多个线程的方式，简单来讲，信号量就是装有一些令牌的容器。当一个线程在执行过程中，就可能遇到一个系统调用来获取信号量令牌，如果这个信号量包含多个令牌，线程就会继续执行，同时信号量令牌的数量就会减一。如果此时信号量中没有令牌，线程就会被置于等待状态，直到出现一个可用的令牌。在线程执行的任何位置，它都可以给信号量增加一个令牌。信号量用来帮助访问程序资]]></description><category></category></item><item><title><![CDATA[CMSIS-RTOS 中断处理Interrupt Handling]]></title><link>https://blog.youkuaiyun.com/sining87/article/details/53243227</link><guid>https://blog.youkuaiyun.com/sining87/article/details/53243227</guid><author>sining87</author><pubDate>Sun, 20 Nov 2016 19:02:40 +0800</pubDate><description><![CDATA[RTOS中断处理Interrupt Handling在RTOS中使用信号来触发线程间的行为是比较简单和高效的，而对于Cortex-M微控制器来讲，从中断源获取信号来触发线程同样是一种重要的方式。虽然在中断服务程序ISR中运行一段代码也可以，但在RTOS系统中，在中断运行的时间越短越好，因为太长的时间会延长定时器的节拍，并破坏RTOS内核。系统节拍运行的优先级在NVIC中是最低的，因此任何中断服务程序]]></description><category></category></item><item><title><![CDATA[CMSIS-RTOS 线程间通信 Inter-Thread Communication]]></title><link>https://blog.youkuaiyun.com/sining87/article/details/53241607</link><guid>https://blog.youkuaiyun.com/sining87/article/details/53241607</guid><author>sining87</author><pubDate>Sun, 20 Nov 2016 16:31:29 +0800</pubDate><description><![CDATA[线程间通信 Inter-Thread Communication前面我们已经学习了如何把你的应用代码设计成独立的线程，以及如何访问RTOS的时间服务函数。在实际的工程应用中，线程间的通信是必不可少的，任何一个RTOS都会支持几种通信方式来连接各种不同的线程。CMSIS-RTOS API支持的通信方式有：信号（signals)，信号量（semaphores），互斥锁（mutexes），邮箱（mailb]]></description><category></category></item><item><title><![CDATA[CMSIS-RTOS 时间管理之空闲线程Idle Demon]]></title><link>https://blog.youkuaiyun.com/sining87/article/details/53241510</link><guid>https://blog.youkuaiyun.com/sining87/article/details/53241510</guid><author>sining87</author><pubDate>Sun, 20 Nov 2016 16:18:58 +0800</pubDate><description><![CDATA[空闲线程Idle DemonCMSIS-RTOS提供的最后一个定时器服务函数并不是一个真正的定时器，但是这里是最合适讨论它的地方。如果在我们的RTOS程序里没有任何线程正在运行，或者准备运行（举个例子，所有的线程都处于等待延时函数中），那么RTOS就会利用空闲的运行时间调用一个“Idle Demon”的线程，这个函数同样位于RTX_Conf_CM.c文件里面，空闲线程拥有一个低优先级，只有在没有其他]]></description><category></category></item><item><title><![CDATA[为什么要用CMSIS RTOS]]></title><link>https://blog.youkuaiyun.com/sining87/article/details/53240767</link><guid>https://blog.youkuaiyun.com/sining87/article/details/53240767</guid><author>sining87</author><pubDate>Sun, 20 Nov 2016 14:31:29 +0800</pubDate><description><![CDATA[CMSIS RTOS是ARM官方推出的RTOS API，很多人认为它就是RTX，实际上它只是封装了RTX，以后还可能封装freeRTOS，uc/os等等第三方OS。它有哪些优势呢？下面是我开始研究它的原因：
集成在keil中，没有所谓移植概念。针对任何MCU都可以一键添加（试想一下，如果你将来用的不是STM32，那么移植OS是不是还是那么容易）；
占用资源极小。大约5kB，而且针对cortex系列A]]></description><category></category></item><item><title><![CDATA[CMSIS-RTOS 时间管理之虚拟定时器Virtual Timers]]></title><link>https://blog.youkuaiyun.com/sining87/article/details/53240733</link><guid>https://blog.youkuaiyun.com/sining87/article/details/53240733</guid><author>sining87</author><pubDate>Sun, 20 Nov 2016 14:26:49 +0800</pubDate><description><![CDATA[虚拟定时器Virtual TimersCMSIS-RTOS API里有几个向下计数的虚拟定时器，它们实现计数完成时用户的回调功能。每个定时器都可以配置成单次计数或重复计数模式，它们可以在定义定时器结构体的时候被创建：osTimerDef(timer0, led_function);在上面的代码中给定时器定义了一个名字timer0，并同时定义了回调函数led_function，紧接着必须对这个定时器进]]></description><category></category></item><item><title><![CDATA[CMSIS-RTOS 时间管理之时间延迟Time Delay]]></title><link>https://blog.youkuaiyun.com/sining87/article/details/53240601</link><guid>https://blog.youkuaiyun.com/sining87/article/details/53240601</guid><author>sining87</author><pubDate>Sun, 20 Nov 2016 13:58:46 +0800</pubDate><description><![CDATA[时间管理 Time Management此RTOS除了可以把你的应用代码作为线程运行，它还可以提供一些时间服务功能，使用这些功能你就可以访问RTOS的一些系统调用。时间延迟Time Delay在所有的时间服务功能中，最基本的一个就是延时函数。它可以在你的应用中提供非常简单易用的延时功能。也许你会觉得CMSIS-RTOS已经占用了5k字节的代码量，但是在非RTOS的应用中，我们也常会用到一些延时循环、]]></description><category></category></item><item><title><![CDATA[CMSIS-RTOS 多重实例化Multiple Instances]]></title><link>https://blog.youkuaiyun.com/sining87/article/details/53240567</link><guid>https://blog.youkuaiyun.com/sining87/article/details/53240567</guid><author>sining87</author><pubDate>Sun, 20 Nov 2016 13:52:56 +0800</pubDate><description><![CDATA[为了简便起见，从这篇文章开始，题目不再增加ARM官方《CMSIS-RTOS教程》几个字。
多重实例化Multiple InstancesRTOS的一个有趣功能就是可以针对一个线程进行多个实例化，例如你可以基于一个线程代码创建多个用于控制UART的实例，此时，每个UART的实例都会管理一个不同的UART硬件。首先我们要创建线程结构体，并设置线程实例个数为2：osThreadDef(thread1, o]]></description><category></category></item><item><title><![CDATA[ARM官方《CMSIS-RTOS教程》之线程的管理和优先级Thread Management and Priority]]></title><link>https://blog.youkuaiyun.com/sining87/article/details/53129546</link><guid>https://blog.youkuaiyun.com/sining87/article/details/53129546</guid><author>sining87</author><pubDate>Sun, 13 Nov 2016 10:46:41 +0800</pubDate><description><![CDATA[这篇文章咱也开始尝尝鲜，用Markdown编辑，主要是三个原因： 
  1.  原来每次写一段都要拖到网页最下面点击保存草稿，这个MD编辑器保存按钮在上面，很方便； 
  2.  MD右侧有预览，不用每次切换到博客刷新去看； 
  3.  写完一大篇文章已经很累了，还要回头用鼠标挨个搞段落、加粗等等，干脆在写文字的时候顺带完成就省事了，如果不去搞段落别人阅读起来又很头大。 
  此外在翻译ARM官方]]></description><category></category></item><item><title><![CDATA[ARM官方《CMSIS-RTOS教程》之创建线程Creating Threads]]></title><link>https://blog.youkuaiyun.com/sining87/article/details/53116253</link><guid>https://blog.youkuaiyun.com/sining87/article/details/53116253</guid><author>sining87</author><pubDate>Sun, 13 Nov 2016 10:26:35 +0800</pubDate><description><![CDATA[一旦RTOS开始运行，就会有很多系统调用来管理和控制活跃的线程。默认情况下，main()函数自动被创建为第一个可运行的线程。在第一个例子里我们使用main()函数创建了其他线程，并且随后让main()结束运行。然而我们还可以让main当成一个真正的thread使用。首先，我们需要获取它的ID号。此时，我们第一个要调用的RTOS函数就是osThreadGetId()，这个函数返回当前运行thread]]></description><category></category></item><item><title><![CDATA[不需要移植，在keil上打个勾就让stm32跑起操作系统]]></title><link>https://blog.youkuaiyun.com/sining87/article/details/53113195</link><guid>https://blog.youkuaiyun.com/sining87/article/details/53113195</guid><author>sining87</author><pubDate>Sat, 12 Nov 2016 22:02:42 +0800</pubDate><description><![CDATA[初识keil5，不得不说自动化配置的强大，建个新工程基本不需要各种粘贴复制文件夹，以前一直担心直接拷贝模板工程会同时拷贝很多垃圾文件，现在就完全不需要担心了。keil5的使用这里不赘述，这次的主题主要是仅仅使用keil软件就让STM32跑起操作系统，不需要所谓的移植。说起让MCU跑操作系统，总让新手望而生畏，让高手觉得没必要，浪费资源，其实如果给MCU添加操作系统就像添加一个GPIO外设一样简单，]]></description><category></category></item><item><title><![CDATA[构造函数在单片机里能干啥]]></title><link>https://blog.youkuaiyun.com/sining87/article/details/41650101</link><guid>https://blog.youkuaiyun.com/sining87/article/details/41650101</guid><author>sining87</author><pubDate>Mon, 01 Dec 2014 17:34:13 +0800</pubDate><description><![CDATA[最近边研究TM1638的驱动库，边学C++。在Thinking C++这本书里，讲构造函数讲的非常直白，其作用就是用来初始化的。
回想我们写单片机程序时，下面这种模样很常见：

void init()
{
   //初始化管脚模式、状态
   //填充定时器
   //配置各种奇葩寄存器
   //...
}

void main()
{
  init();
  //...
  while(]]></description><category></category></item><item><title><![CDATA[测试方法三：电脑+USB转TTL串口模块+HC06]]></title><link>https://blog.youkuaiyun.com/sining87/article/details/41522951</link><guid>https://blog.youkuaiyun.com/sining87/article/details/41522951</guid><author>sining87</author><pubDate>Wed, 26 Nov 2014 21:39:01 +0800</pubDate><description><![CDATA[这里使用的USB转TTL串口模块是CP2102，注意此处不是用电脑的蓝牙和HC06连接，而是用这个转换模块，因为只有这样才能使用AT指令对蓝牙模块进行设置。
HC06的AT指令超级少：
发送命令时不要跟任何其他字符（\0,\n,\r一类） 

一、默认参数：从机，9600,N,8,1。配对密码：1234。
二、AT命令集如下： 


1、测试通讯
发送：AT（返回OK，一秒左右发]]></description><category></category></item><item><title><![CDATA[测试方法二]]></title><link>https://blog.youkuaiyun.com/sining87/article/details/41490093</link><guid>https://blog.youkuaiyun.com/sining87/article/details/41490093</guid><author>sining87</author><pubDate>Tue, 25 Nov 2014 21:10:32 +0800</pubDate><description><![CDATA[如果你用的是笔记本，笔记本上又有蓝牙，那么就可以用这个方法测试。



步骤：
1）打开蓝牙设备。
先打开网络和共享中心，然后step by step跟着图片走吧：



成功添加后，系统就会自动安装驱动.
然后打开设备管理器，看看是不是驱动添加成功：



下一步就要找出哪个串口才是可以发送的。


2）打开串口
用串口调试助手sscom32(自己网上搜，一]]></description><category></category></item><item><title><![CDATA[《蓝牙转串口模块使用注意事项》--方法一]]></title><link>https://blog.youkuaiyun.com/sining87/article/details/41455149</link><guid>https://blog.youkuaiyun.com/sining87/article/details/41455149</guid><author>sining87</author><pubDate>Mon, 24 Nov 2014 22:08:38 +0800</pubDate><description><![CDATA[一个小小的模块就折腾哥几个晚上，搞定后果断分享出来，万一能帮上别人也是快事一件。
拿到蓝牙模块先测试一下你的蓝牙模块能不能用，这里给出四种测试方法，注意前两种方法只是测试蓝牙通信是否正常，要想用AT指令对蓝牙模块进行设置，就必须通过串口TXD/RXD。嗯，我目前的理解就是这样，欢迎批评指正。
------------------------------------------

测试方法一]]></description><category></category></item></channel></rss>