- 博客(21)
- 资源 (11)
- 收藏
- 关注
原创 verilog编程,可能你一直在错误地使用计数器cnt
计数器是verilog编程中非常常用的一种技巧,但是我们如果是C等语言的编程思维则极有可能错误地使用计数器。下面举个例子:module delay ( input clk_sys, //系统时钟 input rst_n, output reg [31:0] time_cnt );parameter DELAY_TIME = 32'd50; //计数总时钟个数reg
2018-01-22 20:12:21 9149 1
原创 verilog编程,请把时序逻辑和组合逻辑彻底分开!
以一个同步加法器为例,使用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;
2018-01-22 15:24:53 11832 3
翻译 CMSIS-RTOS 交汇Rendezvous
交汇Rendezvous一种更常规的信号量通信形式叫做交汇,交汇确保两个线程同时到达某个确定的执行点,除非两个线程都到达这个交汇点,否则它们都不会继续运行。osSemaphore arrived1, arrived2;osSemaphoreDef(arrived1);osSemaphoreDef(arrived2);void thread1(void){ Arrived1 = osSem
2016-11-20 21:54:03 1316
翻译 CMSIS-RTOS 复用Multiplex
复用Multiplex复用是用来限制访问临界代码区的线程个数,举个例子,对于存储空间的访问仅仅可能只支持几个受限的调用。osSemaphoreId multiplex;osSemaphoreDef(multiplex);void thread1 (void){ multiplex =osSemaphoreCreate(osSemaphore(multiplex), FIVE_TOKEN
2016-11-20 21:52:37 1508
翻译 CMSIS-RTOS 信号量的使用Using Semaphores
信号量的使用Using Semaphores前面说过信号量包含较多的OS调用,所以它拥有广泛的同步应用,这也就导致了它可能是RTOS里面最难理解的部分。在本节,我们将看看信号量的一些普遍应用,这些应用摘自“信号量小书”(Allen B. Downey著),这本书可以免费下载,链接在本书的最后部分。发送信号Signaling两个线程之间的同步是信号量最简单的使用方式:osSemaphoreId sem
2016-11-20 21:50:30 1967
翻译 CMSIS-RTOS 信号量Semaphores
信号量Semaphores和信号类似,信号量也是一种同步多个线程的方式,简单来讲,信号量就是装有一些令牌的容器。当一个线程在执行过程中,就可能遇到一个系统调用来获取信号量令牌,如果这个信号量包含多个令牌,线程就会继续执行,同时信号量令牌的数量就会减一。如果此时信号量中没有令牌,线程就会被置于等待状态,直到出现一个可用的令牌。在线程执行的任何位置,它都可以给信号量增加一个令牌。信号量用来帮助访问程序资
2016-11-20 20:40:06 5300 2
翻译 CMSIS-RTOS 中断处理Interrupt Handling
RTOS中断处理Interrupt Handling在RTOS中使用信号来触发线程间的行为是比较简单和高效的,而对于Cortex-M微控制器来讲,从中断源获取信号来触发线程同样是一种重要的方式。虽然在中断服务程序ISR中运行一段代码也可以,但在RTOS系统中,在中断运行的时间越短越好,因为太长的时间会延长定时器的节拍,并破坏RTOS内核。系统节拍运行的优先级在NVIC中是最低的,因此任何中断服务程序
2016-11-20 19:02:40 4810
翻译 CMSIS-RTOS 线程间通信 Inter-Thread Communication
线程间通信 Inter-Thread Communication前面我们已经学习了如何把你的应用代码设计成独立的线程,以及如何访问RTOS的时间服务函数。在实际的工程应用中,线程间的通信是必不可少的,任何一个RTOS都会支持几种通信方式来连接各种不同的线程。CMSIS-RTOS API支持的通信方式有:信号(signals),信号量(semaphores),互斥锁(mutexes),邮箱(mailb
2016-11-20 16:31:29 7052
翻译 CMSIS-RTOS 时间管理之空闲线程Idle Demon
空闲线程Idle DemonCMSIS-RTOS提供的最后一个定时器服务函数并不是一个真正的定时器,但是这里是最合适讨论它的地方。如果在我们的RTOS程序里没有任何线程正在运行,或者准备运行(举个例子,所有的线程都处于等待延时函数中),那么RTOS就会利用空闲的运行时间调用一个“Idle Demon”的线程,这个函数同样位于RTX_Conf_CM.c文件里面,空闲线程拥有一个低优先级,只有在没有其他
2016-11-20 16:18:58 4212
原创 为什么要用CMSIS RTOS
CMSIS RTOS是ARM官方推出的RTOS API,很多人认为它就是RTX,实际上它只是封装了RTX,以后还可能封装freeRTOS,uc/os等等第三方OS。它有哪些优势呢?下面是我开始研究它的原因:集成在keil中,没有所谓移植概念。针对任何MCU都可以一键添加(试想一下,如果你将来用的不是STM32,那么移植OS是不是还是那么容易);占用资源极小。大约5kB,而且针对cortex系列A
2016-11-20 14:31:29 18762
翻译 CMSIS-RTOS 时间管理之虚拟定时器Virtual Timers
虚拟定时器Virtual TimersCMSIS-RTOS API里有几个向下计数的虚拟定时器,它们实现计数完成时用户的回调功能。每个定时器都可以配置成单次计数或重复计数模式,它们可以在定义定时器结构体的时候被创建:osTimerDef(timer0, led_function);在上面的代码中给定时器定义了一个名字timer0,并同时定义了回调函数led_function,紧接着必须对这个定时器进
2016-11-20 14:26:49 7909 1
翻译 CMSIS-RTOS 时间管理之时间延迟Time Delay
时间管理 Time Management此RTOS除了可以把你的应用代码作为线程运行,它还可以提供一些时间服务功能,使用这些功能你就可以访问RTOS的一些系统调用。时间延迟Time Delay在所有的时间服务功能中,最基本的一个就是延时函数。它可以在你的应用中提供非常简单易用的延时功能。也许你会觉得CMSIS-RTOS已经占用了5k字节的代码量,但是在非RTOS的应用中,我们也常会用到一些延时循环、
2016-11-20 13:58:46 6681
翻译 CMSIS-RTOS 多重实例化Multiple Instances
为了简便起见,从这篇文章开始,题目不再增加ARM官方《CMSIS-RTOS教程》几个字。多重实例化Multiple InstancesRTOS的一个有趣功能就是可以针对一个线程进行多个实例化,例如你可以基于一个线程代码创建多个用于控制UART的实例,此时,每个UART的实例都会管理一个不同的UART硬件。首先我们要创建线程结构体,并设置线程实例个数为2:osThreadDef(thread1, o
2016-11-20 13:52:56 2462 2
翻译 ARM官方《CMSIS-RTOS教程》之线程的管理和优先级Thread Management and Priority
这篇文章咱也开始尝尝鲜,用Markdown编辑,主要是三个原因: 1. 原来每次写一段都要拖到网页最下面点击保存草稿,这个MD编辑器保存按钮在上面,很方便; 2. MD右侧有预览,不用每次切换到博客刷新去看; 3. 写完一大篇文章已经很累了,还要回头用鼠标挨个搞段落、加粗等等,干脆在写文字的时候顺带完成就省事了,如果不去搞段落别人阅读起来又很头大。 此外在翻译ARM官方
2016-11-13 10:46:41 6345
翻译 ARM官方《CMSIS-RTOS教程》之创建线程Creating Threads
一旦RTOS开始运行,就会有很多系统调用来管理和控制活跃的线程。默认情况下,main()函数自动被创建为第一个可运行的线程。在第一个例子里我们使用main()函数创建了其他线程,并且随后让main()结束运行。然而我们还可以让main当成一个真正的thread使用。首先,我们需要获取它的ID号。此时,我们第一个要调用的RTOS函数就是osThreadGetId(),这个函数返回当前运行thread
2016-11-13 10:26:35 28117 2
原创 不需要移植,在keil上打个勾就让stm32跑起操作系统
初识keil5,不得不说自动化配置的强大,建个新工程基本不需要各种粘贴复制文件夹,以前一直担心直接拷贝模板工程会同时拷贝很多垃圾文件,现在就完全不需要担心了。keil5的使用这里不赘述,这次的主题主要是仅仅使用keil软件就让STM32跑起操作系统,不需要所谓的移植。说起让MCU跑操作系统,总让新手望而生畏,让高手觉得没必要,浪费资源,其实如果给MCU添加操作系统就像添加一个GPIO外设一样简单,
2016-11-12 22:02:42 13899 9
原创 构造函数在单片机里能干啥
最近边研究TM1638的驱动库,边学C++。在Thinking C++这本书里,讲构造函数讲的非常直白,其作用就是用来初始化的。回想我们写单片机程序时,下面这种模样很常见:void init(){ //初始化管脚模式、状态 //填充定时器 //配置各种奇葩寄存器 //...}void main(){ init(); //... while(
2014-12-01 17:34:13 1344 2
原创 测试方法三:电脑+USB转TTL串口模块+HC06
这里使用的USB转TTL串口模块是CP2102,注意此处不是用电脑的蓝牙和HC06连接,而是用这个转换模块,因为只有这样才能使用AT指令对蓝牙模块进行设置。HC06的AT指令超级少:发送命令时不要跟任何其他字符(\0,\n,\r一类) 一、默认参数:从机,9600,N,8,1。配对密码:1234。二、AT命令集如下: 1、测试通讯发送:AT(返回OK,一秒左右发
2014-11-26 21:39:01 7521
原创 测试方法二
如果你用的是笔记本,笔记本上又有蓝牙,那么就可以用这个方法测试。步骤:1)打开蓝牙设备。先打开网络和共享中心,然后step by step跟着图片走吧:成功添加后,系统就会自动安装驱动.然后打开设备管理器,看看是不是驱动添加成功:下一步就要找出哪个串口才是可以发送的。2)打开串口用串口调试助手sscom32(自己网上搜,一
2014-11-25 21:10:32 1346
原创 《蓝牙转串口模块使用注意事项》--方法一
一个小小的模块就折腾哥几个晚上,搞定后果断分享出来,万一能帮上别人也是快事一件。拿到蓝牙模块先测试一下你的蓝牙模块能不能用,这里给出四种测试方法,注意前两种方法只是测试蓝牙通信是否正常,要想用AT指令对蓝牙模块进行设置,就必须通过串口TXD/RXD。嗯,我目前的理解就是这样,欢迎批评指正。------------------------------------------测试方法一
2014-11-24 22:08:38 5773
原创 week5 Neural Network Learning
以下代码运行通过,仅供参考学习,请勿直接复制使用,对自己负责。如发现问题,欢迎指正。nnCostFunction.m%Part1:a1 = [ones(m, 1) X];z2 = a1*Theta1';a2 = sigmoid(z2);a2 = [ones(m, 1) a2];z3 = a2*Theta2';a3 = sigmoid(z3);for c= 1:num_l
2013-12-03 19:16:17 601
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人