C
文章平均质量分 58
dancebit
我若成魔 佛奈我何
展开
-
USB模拟热拔插
USB设备断开之后,主机D+和D-都被内部电阻拉低,插回之后根据设备的上拉电阻确定设备接入。 拉低D+,D- 50ms, 初始化之前复位 GPIO在USB_Reset后会被USB的相关初始化函数设置。原创 2022-07-13 09:03:44 · 2211 阅读 · 0 评论 -
图像处理之轮廓跟踪算法及圆提取-代码
图像轮廓提取代码实现原创 2022-06-27 17:03:51 · 685 阅读 · 0 评论 -
接触式IC卡 - STM32(Smart Card)
目录1、复位1.1、冷复位1.2、热复位2、Smart Card功能2.1、初始配置2.2、波特率计算2.3、IO收发代码2.4、IC通讯测试接触IC的硬件通讯其实不难理解,上层逻辑层就复杂了,可根据ISO7816-3中规定的标准一一完善即可。这是一个漫长切枯燥的过程,但是一般都是站在巨人的肩膀上完善优化就好,自己动手慢慢敲可不太容易。逻辑协议是根具ISO7816来的,硬件平台是多变的。更换一个硬件平台做到底层修改即可。接触IC主要就两个操作,复位激活+APDU,复位有冷复位和热复位两种,复位只负责接收数据原创 2022-06-02 17:31:54 · 3716 阅读 · 0 评论 -
STM32F407 ADC转换
计算方法可以参考STM32F4 ADC采样转换时间计算方法单次转换所需要的时间就如文档所说的。实测结果通过DMA连续采样30000个数据,定时器2(32位计时器)作为us计时器。经过测试,转换的时间是很精确的,基本等于理论值 15/21=0.71428us测试代码#define ADC_CON_NUM 30000uint16_t adc_value[ADC_CON_NUM];// PCLK2 84MHZ/4 4分屏 // 12位 单次:0.714300u.原创 2022-04-01 18:02:49 · 1469 阅读 · 0 评论 -
STM32/APM32 M0内核IAP升级
1、APP部分,M0内核的向量表必须拷贝到内存,并将中断向量修改为RAM#define SYSCFG_MemoryRemap_SRAM ((uint8_t)0x03)void IAP_Set(){ uint32_t i = 0; /* Relocate by software the vector table to the internal SRAM at 0x20000000 ***/ /* Copy the vector table from the Flash原创 2022-03-09 17:45:15 · 1411 阅读 · 0 评论 -
C 伪线程四 - 线程及独立栈实现
接上文,已经验证可以自己定义栈空间了,那么这次移入到伪线程中setjmp longjmp两个函数是能够保存会恢复栈的。所以只需要在启动的第一次配置好伪线程栈的地址即可。当退出伪线程后,恢复主栈地址即可。上面这一切也是个人设想,没依据调度器void TaskScheduler(){ if (context_head == NULL) { return;//没有线程 } if (setjmp(SchedulerStack) == 0) //压入退出时的栈 { .原创 2021-12-30 18:00:46 · 720 阅读 · 0 评论 -
C 伪线程三 - 自定义栈地址
接上文,据我猜测,如果栈可以自己定义地址,每个线程设置不同的栈空间,那么伪线程的局部变量也将是安全的,不会被其他线程覆盖,所以。。。。测试代码uint32_t stack[500]; //自定义堆栈地址int test_fun(int param){ volatile int buff[20] = { 1, 2, 3, 4, 5, 6, 7, 8 }; return 9;}int fn(){ __asm { mov eax, esp //当前栈位置保存起来 lea原创 2021-12-30 16:34:31 · 519 阅读 · 0 评论 -
C 伪线程二 - setjmp longjmp 实践
上一章节,拿出一个线程来开口子,就是不希望因为线程占用了全部CPU,其他不被线约束的程序照常进行。只要从周期调用线程调度就可以,这是本次设计的基本要求。原创 2021-12-30 10:34:48 · 557 阅读 · 0 评论 -
C 伪线程一 - setjmp longjmp 验证
需求来源于困难,在单片机上我们一般都是跑逻裸机,主要就是单线程加中断的方式写代码。我个人很不喜欢用状态机的方式写代码,会很多的状态变量和全局参数。但是我在一些场合遇到了不得不用状态机的时候,我写起来又不想又很多的全局变量,还希望代码模块化。到最后把我自己的代码眶的超难受。所以就萌生了伪多线程的需求。之前就知道 setjmp longjmp两个函数可以实现函数间跳转,所以便尝试研究起来。测试一、3个任务成环#include "stdio.h"#include &l...原创 2021-12-29 17:54:22 · 496 阅读 · 0 评论 -
malloc 内存信息获取
因为在一个STM32F4平台的开发项目中使用了C++编程,使用到了new 、 delete ,malloc ,free 等堆空间操作的函数。工程稍大,会偶尔提示分配失败的清空,所以怀疑内存泄露了,所以会想到怎么查看当前使用到的堆空间情况。搜索一波无果,全是一些不着边际的废话heapstats堆信息获取跳到stdlib.h头文件下看到这样一个函数。typedef int (*__heapprt)(void *, char const *, ...);extern _ARMABI v.原创 2020-10-17 19:36:49 · 781 阅读 · 0 评论 -
C位域操作和位操作比较
目录1、位域1.1、测试代码:1.2、汇编:1.3、分析:2、位操作2.1、测试代码2.2、位操作汇编对照结论1、位域通过Keil反编译研究了一下 位域的读写操作。之前一直以为位域的操作就像变量的读写操作一样,同MOV指令一样一条指令搞定,结果不是。1.1、测试代码:typedef struct{ int a : 1; int b : 1; int d : 1; int e : 1; int f : 1;} register_.原创 2021-12-13 16:35:22 · 1222 阅读 · 0 评论 -
W806芯片性能测试
指令执行时间测试在CPU为160Mhz下测试SystemClock_Config(CPU_CLK_160M);GPIO翻转测试 while (1) { GPIOB->DATA &= ~GPIO_PIN_0; GPIOB->DATA |= GPIO_PIN_0; GPIOB->DATA &= ~GPIO_PIN_0; GPIOB->DATA |= GPIO_PIN_0; HAL_Delay(100); }...原创 2021-11-01 13:32:14 · 4700 阅读 · 2 评论 -
C语言小记
strlen(str)strlen函数以检测字符中的0结尾,返回结果长度不包括末尾0,在复制字符串时记得+1sscanfchar str[100]; sscanf(data,"%*s %s",str);sscanf提取出来的字符串成功后会自动加上末尾0原创 2021-09-23 11:41:11 · 65 阅读 · 0 评论 -
时间 time_t
做了一个简单的时间校准及显示的小时钟,记录一下所用到的一些时间函数time_t实际上是长整型,到未来的某一天,从一个时间点(一般是1970年1月1日0时0分0秒)到那时的秒数(即日历时间)1、时间同步上位机采用C#协调世界时 UTC:long utc_tim = (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000;本地时间:long local_tim = (DateTime.Now原创 2021-08-30 13:40:28 · 362 阅读 · 0 评论 -
keil symbol外部符号定义
symdef文件格式用于定义外部引用的函数或者数据,可用于程序分段维护#<SYMDEFS># 0x000222 D data10x122222 T fun1文件开头#<SYMDEFS>#数据符号定义:0x000222 D data1数据地址 D 引用符号函数符号定义:0x122222 T fun1函数地址 T 函数符号文件可作为任意格式保存,添加到工程,Option中文件...原创 2021-04-20 13:36:47 · 2945 阅读 · 0 评论 -
c#调用c/c++动态库dll笔记
目录创建dll新建dll工程添加def导出文件导出函数实现C#调用dll创建dll新建dll工程添加def导出文件【源文件】》【添加新建项】》【模块定义文件def】def文件格式,EXPOTS后面紧跟导出的函数名称 @数字累加LIBRARYEXPORTS ShowMessage @1导出函数实现#include "stdafx.h"#include "stdio.h"#define CMDEXECUTEDLL_API...原创 2020-11-20 10:00:34 · 200 阅读 · 0 评论 -
lua_pop lua_settop 栈研究
我知道它是退栈的,但是退的是栈底还是栈顶。搜索一波还是没明白,自己动手测吧...测试程序static int lua_test(lua_State *L){ int pop_num = lua_tointeger(L,1); lua_settop(L,0); printf("1-top %d\r\n",lua_gettop(L)); lua_pushinteger(L,31); lua_pushinteger(L,32); lua_pushint原创 2020-08-06 15:45:40 · 5869 阅读 · 0 评论 -
C语言#define拼接宏定义实现
使用场合:拼接两个宏,一个是传入的宏。但是传入的宏不会被替换,反而原封不动的接了上去,这就尴尬了。经过各种尝试,居然成了,特此记录分享一下,方便大家学习。char A_param=0;char B_pramm=0;//添加宏定义#define OBJECT A#define DEFINE_(X)X##_param //一次定义原创 2018-01-21 12:22:25 · 17967 阅读 · 1 评论 -
嵌入式lua之多线程操作移植三 lua FreeRTOS
然而,使用前章方法移植到FreeRTOS上后却各种不尽人意。辛辛苦苦搞了几个星期,先展示下效果吧!!!压力测试11个线程。led间隔100ms闪烁,10个打印线程正常。中途遇到的问题记录执行lua文件频繁时会返回如下错误:[#err : execute fail(1) cannot open 0:/TEST.LUA: No error (errno = 0)]原因:打开文件过快,会造成文件读取冲突,所以文件操作需要加上互斥锁。顺便一提,lua的锁lua_lock,lua..原创 2020-07-30 18:39:01 · 3324 阅读 · 2 评论 -
嵌入式lua之多线程操作移植 二 中断测试
继续上一章前面只能指定函数名实现函数传递,我的目的是随时注册线程,不需要要指定函数名。所以我希望C能保存lua传递进来的函数,在指定的地方调用该函数。参考博客:lua注册表和引用系统,LUA_REGISTRYINDEX、luaL_ref、luaL_unref的用途便确定两个函数,luaL_ref:存放函数到注册表中并返回引用lua_rawgeti:从注册表中读取该函数并调用lua注册函数程序及主线程程序local a = 0local function callbac.原创 2020-07-29 20:08:36 · 419 阅读 · 0 评论 -
嵌入式lua之多线程操作移植 一 中断测试
目的:在lua文本中灵活创建多线程函数,类似如下效果(来源合宙Luat)。底层通过FreeRTOS去实现多线程。-- 测试代码,用于发送消息给socketsys.taskInit( function() while true do sys.publish("pub_msg", "11223344556677889900AABBCCDDEEFF" .. os.time()) sys.wait(180000) en原创 2020-07-29 09:05:24 · 906 阅读 · 0 评论 -
编码器正交解码 STM32F4
原理:当计数值向上溢出或者向下溢出时,对应增加和减少重装载的值 0xFFFF。 对此读取 (TIM1->CNT+abs_count)是为了防止中途被中断打断而破坏组包数据。不建议屏蔽中断去读取,查询过快时也会造成中断开启关闭过快,会造成系统实时性下降。static int abs_count = 0;//绝对位置void Speed_ENC(void){ GPI...原创 2020-03-06 17:59:22 · 1960 阅读 · 0 评论 -
程序架构之事件机制 event
事件处理机制在操作系统上是随处可见,比如电脑键盘按下一个按钮,其实是硬件驱动层抛出的一个事件。就看上层应用谁有这个权限去捕捉这个消息。权限这个在我的小架构里还展示不考虑。实现原理我的事件处理机制大致如下,一个事件可以有多个发布者,可以有多个订阅者,可以多个同时订阅一个事件消息。发布者其实就是逐一执行订阅者存放在队列里的回调函数。没有优先级要求。结构类型//事件控制...原创 2019-08-04 18:06:03 · 648 阅读 · 0 评论 -
程序架构之全局变量管理 (DB)
对于一个处女座的程序源来说,很反感那种全局变量乱飞,函数之间扯来扯去,乱入一团麻的感觉。程序本可以是很优雅,很美观的一种享受。所以我自己试图定制一套适合于单片机的软件架构。本来是想上一个专栏的,结果发布的博客不够数量。先一点点积攒吧绪论程序架构是一个很大很宽泛的东西,像建房子一样,需要一点点的来。单片机程序如果需要做大,文件慢慢增多,你会慢慢发现程序间的变量开始乱飞了,很多...原创 2019-08-03 23:01:29 · 862 阅读 · 0 评论 -
MQTT初体验-百度智能云
说明:该文章记录了基于百度智能云MQTT服务器的测试使用过程,方便以后查阅。MQTT协议中文版下载https://legacy.gitbook.com/book/mcxiaoke/mqtt-cn/details1、创建百度智能云登陆入口地址:https://login.bce.baidu.com/?account=找到如下入口并进入。创建新项目:设备...原创 2019-04-16 15:44:50 · 3272 阅读 · 0 评论 -
局部变量和全局变量的执行效率问题
定义局部变量:指在函数内部声明的变量全局变量:指在所有函数外部定义的变量测试int a=0;//全局变量int function(){ int b=0;//局部变量 a++; b++; printf("%d %d\r\n",a,b); return 0;}在keil5中的针对Cortex-M3内核的汇编如下:a为全局...原创 2019-04-01 15:11:46 · 5001 阅读 · 1 评论 -
C语言 char 和 signed char的区别
在STM32项目的开发过程遇到一个奇葩的问题,测试代码如下: char _char =-1; if(_char!=-1) { pr_dbg("_char!=-1\r\n"); } else { pr_dbg("_char!=-1\r\n"); }结果输出:1048 [dbg] main ...原创 2019-03-31 17:31:49 · 6200 阅读 · 0 评论