1.嵌入式39——system_stm32xx.c/.h文件的嵌入作用
2.newlib简介
3.STM32代码转换工具 | SPL2LL-Converter实现标准库SPL代码转换为LL库代码
4.手把手教你STM8单片机标准库移植
5.java åµå
¥å¼ åªä¸ªå¥½å°±ä¸
6.åµå
¥å¼å¼åä¸Cè¯è¨ç¼ç¨çä¸äºè¦ç¹ç®è¿°
嵌入式39——system_stm32xx.c/.h文件的作用
system_stml4xx.c/system_stml4xx.h 文件涉及的是系统初始化函数 SystemInit 和系统时钟更新函数 SystemCoreClockUpdate 的声明与定义。
SystemInit 函数主要负责时钟系统的式标初始化操作,以及中断向量表偏移地址的准库设置。值得注意的源码是,它并不负责设置具体的分析时钟值,这是嵌入发卡源码淘宝它与标准库的主要区别。在标准库中,式标SystemInit 函数会自动为我们配置好与系统时钟配置相关的准库各个寄存器。
当启动文件 startup_stmlxx.s 被设置后,源码系统复位时将直接调用 SystemInit 函数进行系统初始化。分析
SystemCoreClockUpdate 函数则用于在系统时钟配置发生修改后更新全局变量 SystemCoreClock 的嵌入值。SystemCoreClock 是式标一个全局变量,开放这个变量可以让我们在用户代码中直接使用这个变量进行时钟运算,准库从而更加方便。源码
newlib简介
Newlib是分析一个专为嵌入式系统设计的C标准库,起源于Cygnus Solutions的源代码集成项目,最初的名称即为newlib。目前,它由Red Hat进行维护,最新版本达到了1..0。尽管在GNU兼容的嵌入式C运行库领域,newlib并非唯一选择,但其在成熟度和性能上的卓越表现使其脱颖而出。 newlib的核心优势在于其独特的架构,它精心设计以适应深度嵌入式系统的苛刻需求。其高度的hidove影视源码可移植性是其显著特点之一,这使得它能够在各种各样的嵌入式平台上稳定运行。此外,newlib还具备可重入特性,这意味着其函数可以在多线程环境中安全地被调用,这对于资源受限的嵌入式环境至关重要。 newlib功能完备,包括基本的I/O操作、内存管理、字符串处理等功能,广泛应用于众多的嵌入式系统开发中,是开发者构建高效、可靠嵌入式应用的重要工具。无论是小型微控制器还是大型嵌入式设备,newlib都以其稳健性和灵活性赢得了开发者们的青睐。扩展资料
Newlib是一个面向嵌入式系统的C运行库,目前的最新的版本是1..0。newlib具有独特的体系结构,能够非常好地满足深度嵌入式系统的要求。newlib可移植性强,具有可重入特性、功能完备等特点,已广泛应用于各种嵌入式系统中。STM代码转换工具 | SPL2LL-Converter实现标准库SPL代码转换为LL库代码
在STM早期开发中,多数工程师倾向于使用标准外设库(SPL)进行编程。然而,天尊屠龙源码随着技术发展,STMCube LL库成为新宠,如何在保持代码复用性的情况下,将SPL代码转换为LL库呢?
本文将详细介绍一款名为SPL2LL-Converter的工具,它能帮助你实现这一转换过程。SPL,即标准外设库,是为过程导向的嵌入式开发者设计的,包含了丰富的外围设备驱动代码。而LL库,即低层库,更注重性能和简洁性,适合对寄存器操作熟悉的开发者。
从官方角度来看,四种主要的STM库——STMSnippets、SPL、STMCube HAL和LL各有优势。例如,对于资源有限的STM,LL库可能是更好的选择,它的API更规范,移植性更强。此外,新推出的芯片可能不支持SPL,这时就需要利用LL库进行开发。氢os源码
SPL2LL-Converter的使用并不复杂。首先,需要安装ActivePerl工具,可以通过官方或网盘获取。安装完成后,解压SPL2LL-Converter工具,运行spl2ll_converter_gui.jar文件。选择源代码的SPL库型号和路径,点击“Migrate”开始转换。这个过程可能需要一定时间,因为它会遍历并转换你的源代码。
转换完成后,你将看到SPL代码已被成功转化为LL库格式,即使被屏蔽的代码也会被处理。希望这个工具能帮助你顺利地进行代码库的转换,提升开发效率。
手把手教你STM8单片机标准库移植
完成Lora模块单片机STM8LF3标准库移植
STM8LF3单片机,作为一款8位单片机,与传统的系列有很大区别。
内核方面,单片机采用的是传统内核,而STM8则拥有ST公司独有的内核。同时,其内部寄存器数量更多,资源更丰富,问道源码管理功能强大,价格相比系列略高。
ST公司提供了STM8单片机对应的标准库,程序开发通常基于此库进行,而C系列单片机则直接基于寄存器进行开发。
搭建STM8单片机开发环境对于开发者尤为重要。与STM相似,STM8开发基于标准库,使操作更为便捷。
步骤一:下载STM8标准库
在百度搜索或ST官网下载STM8L标准库。官网下载需注册账号,确保资料获取。
步骤二:使用IAR新建工程
在IAR for STM8中新建STM8单片机工程,保存至指定文件夹。选择C语言,保存配置后,界面显示工程文件和标准库文件。
步骤三:移植标准库
在标准库文件夹中复制指定文件至工程文件夹。在User目录下增加stm8lx_it.C文件。配置工程,选择目标单片机型号、添加包含目录和输入文件。编译验证,确保无错误。
额外资源:WiFi网络编程、物联网通信协议、物联网智能插排项目、STM+LoRa系统设计、嵌入式操作系统uC/OS、温湿度采集等学习资料。
java åµå ¥å¼ åªä¸ªå¥½å°±ä¸
æ¯è¿æ ·çã
1ãjavaæ¯ä¸ç§ç¼ç¨è¯è¨ï¼çº¯è½¯ä»¶ï¼åµå ¥å¼æ¯å å«è½¯ç¡¬ä»¶å¨å ç以åºç¨ä¸ºä¸å¿ç计ç®æºç³»ç»ã
2ãjava主è¦å¾çäºæºè½ææºåå¹³æ¿çµèçè¿ çåå±ï¼èåµå ¥å¼æ¯æ å¤ä¸å¨ãæ æ¶ä¸éçã
3ãåµå ¥å¼è½ä»äºçå·¥ä½æ¯javaæ´å¤æ´çµæ´»ã
4ãå¦javaæ¯å¦åµå ¥å¼ç®åã
5ãç®åçæ åµæ¯ï¼javaçå·¥èµé«ï¼ä¸è¬ä»¥ä¸ï¼ä½ä¸å空é´å°ï¼åºå±æ¯ä¸çï¼ä¸¤å¹´å·¥ä½ç»éªçè¿æ¯ï¼åæ ¡æ¯ä¸çï¼å¤§ä¸æ¯ä¸çè¿æ¯ï¼å 为ç¸å¯¹ç®åï¼æ以差è·ä¸ä¼å¾å¤§ï¼ï¼åµå ¥å¼çå·¥èµå¯¹äºä¸åè½åç人差è·è¾å¤§ï¼å 为æåµå ¥å¼ç人ï¼æè½åè·æ²¡è½åçå·®è·ä¼å¾ææ¾ï¼åæ ¡-ï¼å¹³åï¼ä¸æ¬-ï¼å¹³åã
6ãåå±åæ¯ï¼åµå ¥å¼>>>>>>>>>>>>JAVAãè¿æ¯å 为æ纯软件çï¼ææ¥æå»å°±æ¯é£ä¹äºä¸è¥¿ï¼å·¥ä½ç»éªä¸ä¼ç»ä½ 带æ¥å¤å°æé¿ï¼å½èªå·±å¹´çºªä¸å¤§ï¼è¿ï¼ï¼å ¬å¸å°±æ´æ¿æç¨é£äºå»ä»·ç年轻人äºï¼é¤éä½ å¿çæ æ¿è·ä»ä»¬æ¿ä¸æ ·çå·¥èµãèåµå ¥å¼è¡ä¸ç人ï¼éçå·¥ä½æ¶é´è¶æ¥è¶é¿ï¼ä»ä»¬è½èä»»çå·¥ä½è¶æ¥è¶å¤ï¼å 为åµå ¥å¼æ¬èº«å°±æ¯ä¸ªæ¶µçé¢æ广ãæé¾åç¡®å®ä¹çè¡ä¸ãæ¯å¦åå¼å§åªæ¯ååµå ¥å¼è½¯ä»¶çï¼å°åæ¥ä¹ä¼å硬件äºï¼åå¼å§å硬件çå°åæ¥ä¹å¯ä»¥å软件äºãå ¬å¸åªä¼è¶æ¥è¶åéä»ä»¬ï¼å èªåèå°½åçä½ä»ä»¬ãæ´å ³é®çä¸ç¹æ¯ï¼å¼å硬件å¯ä»¥è®©ä½ ææ´å¤æºä¼èµ°ä¸ä¸äºè·å®¢æ·æ交éçå²ä½æ¯å¦FAEï¼ä¸æ¦è·å®¢æ·æ交éäºï¼å ä¸è¯´ä½ å¨å ¬å¸çå°ä½ä¼æé«ï¼å¯¹ä½ èªèº«çå ¶ä»åå±éè·¯ä¹æ¯ä¸ç§æºéï¼è¿ä¸ªèªå·±ä½ä¼å§ã
以ä¸è®ºæ纯å±ä¸ªäººçæ³ï¼æ²¡æç»å¯¹æ§ï¼å ¶å®æ 论ä»ä¹è¡ä¸ï¼æå ³é®çè¿æ¯èªå·±åªå
åµå ¥å¼å¼åä¸Cè¯è¨ç¼ç¨çä¸äºè¦ç¹ç®è¿°
å¨åµå ¥å¼LinuxçCè¯è¨å¼åä¸ï¼Cè¯è¨çåºæ¬ç¼ç¨ä¾ç¶æ¯æéè¦çå 容ãé¤æ¤ä¹å¤ï¼ä¸ä¸è¬çCè¯è¨ç¼ç¨ç¸æ¯ï¼åµå ¥å¼LinuxçCè¯è¨ç¼ç¨æ以ä¸ä¸äºè¦ç¹ï¼1ãåºå½æ°ä¸ç³»ç»è°ç¨ å¨è¿è¡Cè¯è¨ç¼ç¨çæ¶åï¼ä½¿ç¨åºå½æ°æ¯ä¸å¯é¿å çãå ³äºä½¿ç¨åºå½æ°çæç®åçä¾åå°±æ¯printf()ã
å¨Linuxç¯å¢ä¸çCè¯è¨ç¼ç¨ä¸ï¼åºå½æ°å æ¬ä¸¤ä¸ªé¨åï¼ä¸ç§æ¯Cè¯è¨çæ ååºå½æ°ï¼ä¾å¦å å«srting.h头æ件çå符å¤çå½æ°ãå å«stdio.h头æ件çæ åè¾å ¥/è¾åºå½æ°ãå å«math.h头æ件çæ°å¦å½æ°çï¼å¦ä¸ç§æ¯UNIXåLinuxç¹å®çåºå½æ°ï¼ä¾å¦UNIXç¹å®çæ件æä½å½æ°ãæéå¤çå½æ°ä»¥åç¹å®çç³»ç»è°ç¨çã
ç±»ä¼¼å ¶å®çUNIXç³»ç»ï¼Linuxçå¾å¤åºå½æ°æ¯éè¿ç³»ç»è°ç¨å®æçãåºå½æ°ä¾ç¶éè¿å å«æ åCè¯è¨å¤´æ件çæ¹å¼ä½¿ç¨ï¼å¨åºå½æ°å®ç°ä¸ä½¿ç¨Linuxçç³»ç»è°ç¨å®æãå¨åµå ¥å¼Linuxä¸ï¼å¾å¤æ åçCè¯è¨åºå½æ°éè¦èèç³»ç»ç¹å®çæ åµã
ä¾å¦printf()çåè½æ¯å°å 容æå°å°æ åçè¾åºãå¨éç¨ç计ç®æºä¸ï¼æ åçè¾åºä¸è¬é»è®¤æ¯æ¾ç¤ºå¨ãä½æ¯å¨åµå ¥å¼çç³»ç»ä¸ï¼æ åçè¾åºæ¯ä¸ç¡®å®çï¼å¯è½æ¯æç§æ¾ç¤ºè®¾å¤ï¼æ¯å¦æ¾ç¤ºå¨ï¼ï¼ä¹å¯è½æ¯ä¸²å£çãè¿äºä¸åµå ¥å¼Linuxæä½ç³»ç»å æ ¸çé ç½®æå ³ã
2ãCè¯è¨é«çº§åºç¨ ç®åï¼è®¡ç®æºææ¯é«éåå±ï¼åç§ç¼ç¨è¯è¨åå±è¿ éãåç§é«çº§è¯è¨æçåèªçä¼å¿ï¼C++å ·æå®å ¨é¢å对象çç¹ç¹ä»¥åéå¸¸å ¨é¢çåè½ï¼Javaå ·æä¸å¹³å°æ å ³çç¹æ§ï¼C#åå©å¾®è½¯ç强åæ¯æï¼åæ¯ä¹é常广éï¼åç§èæ¬è¯è¨åæçæ éç¼è¯ãç®åææçç¹ç¹ã
ä¸ä¸è¯è¯è¨ç¸æ¯ï¼Cè¯è¨æ¯ä¸ç§é¢åè¿ç¨çè¯è¨ï¼ä»äºé«çº§è¯è¨ä¸ä½çº§è¯è¨ä¹é´ãç¡®åå°è¯´ï¼å¨éç¨è®¡ç®æºåºç¨å±ç软件å¼åé¨åï¼Cè¯è¨ä¸åç§é«çº§è¯è¨ç¸æ¯æ²¡æä¼å¿ãè¿æ¯ç±äºåç§é«çº§è¯è¨ä¸ä½éåå¤æåºç¨é»è¾çç»ç»åå®ç°ï¼èä¸æä¾äºæ´å¥½çç¼ç¨ç¯å¢ååºç¨ç¨åºæ¥å£ãå¼åè 使ç¨é«çº§è¯è¨å¯ä»¥å¿«éãé«æå°å¼ååºåç§çåºç¨ç¨åºã
Cè¯è¨çä¼å¿å¨äºå®æçé«æå°è¿è¡æçï¼å æ¤è½ç¶å¨åºç¨ç¨åºçå¼åé¢åCè¯è¨å¹¶ä¸å ä¼å¿ï¼ä½æ¯å¨åµå ¥å¼Linuxçå¼åä¸ï¼Cè¯è¨å´å æ®ä¸»å¯¼çå°ä½ã
äºå®ä¸ï¼Cè¯è¨çä¸äºé«çº§ææ¯ï¼å¨åµå ¥å¼Linuxçå¼åä¸å¾å°å¾å¥½çåæ¥å使ç¨ãè¿äºææ¯è®©Cè¯è¨è¿ç§é¢åè¿ç¨ãä¸ç¡¬ä»¶è系紧å¯ç计ç®æºè¯è¨å¯ä»¥å®ææ´å¤æçé»è¾ç»ç»åè½ãè¿å¯¹äºé常éè§æçï¼èåå ·æç¹å®ç¨åºé»è¾çåµå ¥å¼ç³»ç»æ¯é常éè¦çã
3ãåµå ¥å¼ç³»ç»å¼åä¸Cè¯è¨ç¹æ®è¯æ³ å¨åµå ¥å¼çCè¯è¨ç¼ç¨ä¸ï¼æ使ç¨çè¯è¨ä¾ç¶å¨Cè¯è¨çèç´å ï¼ä½æ¯ä¸äºç¨æ³åä¼ ç»çCè¯è¨ç¼ç¨æä¸å®çå·®å«ã
è¿äºç¹æ®çè¯æ³å æ¬ï¼ä½¿ç¨Cè¯è¨å¯¹ç®æ 硬件å¯åå¨çæä½é®é¢ï¼ä¸åä½ç³»çå¤çå¨ç大å端é®é¢ï¼å åæä½ç对é½é®é¢ï¼ç¨åºä¸ç»å¯¹å åå°åç跳转çã
4ãåµå ¥å¼ç³»ç»å¼åä¸Cè¯è¨ç¼ç¨çè¦ç¹ å¨åµå ¥å¼ç³»ç»ä¸ï¼ç±äºèµæºé常æéï¼å¯¹ç¨åºè¿è¡æççè¦æ±æ¯è¾é«ãå æ¤ï¼ä¸äºå¨éç¨è®¡ç®æºç³»ç»ä¸ä¸ç¨èèçæ§è½é®é¢ï¼å¨åµå ¥å¼ç³»ç»ä¸é½éè¦èèãå¨åµå ¥å¼å¼åä¸ï¼æ§è½æ¯ä¸ä¸ªæ ¸å¿çé®é¢ï¼ä¹æ¯Cè¯è¨ç¼ç¨çè¦ç¹æå¨ã
对äºä¸ç§ç¨åºå®ç°çè¯ä»·ï¼ä¸»è¦å¯ä»¥ä»ä¸¤ä¸ªæ¹é¢èèï¼ä¸ä¸ªæ¹é¢æ¯ç¨åºè¿è¡çæçï¼å¦ä¸ä¸ªæ¯ç¨åºéè¦çåå¨å¨ç©ºé´ã对äºåè ï¼ä¸»è¦æ¯æç¨åºè¿è¡æéè¦çå¤çå¨ç©ºé´ï¼ä¸å ç¨ç³»ç»å¤çå¨å°æ¶é´æå ³ï¼å¯¹äºåè ï¼å æ¬ç¨åºåå¨æå ç¨ç空é´åç¨åºè¿è¡æå ç¨ç空é´ï¼ä¸å ç¨ç³»ç»ROMåRAM大å°æå ³ãç±äºCè¯è¨èªèº«çæ§è´¨ï¼ä¹ä½¿å ¶å¨åµå ¥å¼å¼åçæ§è½ä¼å以åè°è¯æ¹é¢å ·æç¬ç¹çæ¹æ³ã
以ä¸å°±æ¯æ¬æ¬¡å享çææå 容ï¼æ³è¦äºè§£æ´å¤æ¬¢è¿åå¾å ¬ä¼å·ï¼C è¯è¨å¦ä¹ èçï¼æ¯æ¥å¹²è´§å享
åæï¼/post/
每日开源:一个巨硬的产品级嵌入式流媒体库
哈喽,我是老吴。
今天分享一个比较复杂的开源项目:live 是一个开源的流媒体库,用于实现实时流媒体的传输和处理。它提供了一套跨平台的 C++ 类库,帮助快速构建高效、可靠的流媒体服务器和客户端应用程序。
live的代码量庞大,约9w行代码。如果专注于核心逻辑,代码量缩减到约8K行。使用live,你可以收获高效可靠的流媒体库,了解产品级的C++项目设计,掌握音视频基础知识,甚至获得基于select()的C++事件循环库。live在媒体播放器、流媒体服务器、视频监控系统等领域应用广泛,如VLC、FFmpeg、GStreamer均使用live实现流媒体的接收和播放。
live基于C++,语法相对简单,适合专注于学习C++类设计和编写专业的C++软件。为了理解源码,需要补充多媒体、流媒体的理论知识。通过阅读和运行相关应用,加深对理论知识的理解。
编译live库后,会生成4个静态库:libBasicUsageEnvironment.a和libUsageEnvironment.a用于实现事件循环、上下文管理、任务管理等;libliveMedia.a负责多媒体流化,包括音视频编解码、流媒体协议实现;libgroupsock.a负责网络IO功能,核心是TCP、UDP的读写。简单示例是RTP传输MP3音频,涉及server和client两个程序。
server程序的核心逻辑包括准备运行环境、设置数据来源、设置数据目的地。TaskScheduler用于任务管理,基于select()实现事件循环。BasicUsageEnvironment用于上下文管理。数据流化本质是网络传输,Source和Sink分别表示数据源和目的地,本例中Source是MP3FileSource,Sink是MPEG1or2AudioRTPSink。client端程序同样初始化Source和Sink。
RTP协议简介,RTP(Real-time Transport Protocol)是一种用于实时传输音频和视频数据的网络传输协议,基于UDP,用于在IP网络上传输实时媒体数据。RTP协议设计目标是提供低延迟、高效率的传输,以满足实时应用需求。主要特点包括时间戳、序列号、负载类型、NACK反馈和RTCP(Real-time Transport Control Protocol)等。
关键问题是如何实现数据一帧帧流化?关注点不是具体音视频格式解析或特定协议实现,而是live对音视频流化的整体框架。通过示例分析,live本质上将音视频数据逐帧解码,通过RTP协议经网络发送。live封装了多种数据Source和Sink,但无需详细了解每个概念。仍以RTP传输MP3数据为例,分析live的工作流程。
首先,需要对相关类的关系有大概概念:MediaSource是所有Source的父类,各种具体音视频Source基于其派生;MediaSink是所有Sink的父类,派生出FileSink、RTPSink等众多Sink类。Sink类最关键的成员函数是startPlaying(),用于使用Source对象获取帧数据,然后发送至网络。
RTP传输MP3的主要逻辑包括准备就绪后调用MediaSink::startPlaying()启动数据流化,在packFrame()调用Source对象的getNextFrame()。getNextFrame()最终调用MP3FileSource的doGetNextFrame(),负责MP3音频解码,解码完成后,回调afterGettingFrame(),正常时调用sendPacketIfNecessary()发送数据,并添加至事件循环调度器中。一段时间后,MultiFramedRTPSink的sendNext()被调用,推动新一帧数据传输,直到Source中的所有帧数据被消费。
live如何创建RTSP服务器?通常RTP协议与RTSP协议结合使用,对外提供RTSP服务器服务。RTSP提供控制实时流媒体传输和播放的标准化方式,可以控制播放、暂停、停止、快进、后退等功能。添加几行代码即可创建RTSP服务器。RTSP服务器封装实现RTSP服务,类似HTTP协议,是文本协议。服务器包括接受客户端连接、读取客户端数据、解析和处理数据的操作。
总结,live是一个开源的多媒体流媒体库,支持常见流媒体协议,提供高效可靠的流媒体传输功能,适用于构建流媒体服务器和客户端应用程序。使用live需要熟悉C++编程和网络编程知识,官方提供丰富示例代码,帮助快速熟悉库的使用方法。