1.bootstrapålayer
2.PyTorch 源码分析(三):torch.nn.Norm类算子
3.Drawableåç±»ä¹ââLayerDrawable ï¼å¾å±å å ï¼
4.bootstrapålayerç¨åªä¸ª
5.FasterTransformer Decoding 源码分析(三)-LayerNorm介绍
6.openlayers4 入门开发系列之地图切换篇(附源码下载)
bootstrapålayer
bootstrapålayeræä¹ä½¿ç¨
Bootstrapå¸å±
ç®ä»
å¨æ¬æç¨ä¸ï¼æ¨å°å¦ä¹ å¦ä½ä½¿ç¨Bootstrapå·¥å ·å æ¥å建åºå®å¸å±åæµå¨å¸å±ãæç¨æ¯åºäºBootstrapçæ¬2.0ã
å¨çæ¬2.0ä¸ï¼Bootstrap为ææºãå¹³æ¿çµèãç¬è®°æ¬ãå°åå°å¼æºã大å宽å±å°å¼æºçæ·»å äºååºç¹æ§ã
å¯ä»¥éè¿å页é¢æ·»å bootstrap-responsive.cssæ件ï¼ä½äºdocs\assets\cssä¸ï¼æ¥è®©å¸å±å ·æååºæ§ã
Bootstrapåºå®å¸å±
å¦ææ¨æ³è¦å建åºäºåºå®åç´ æ°çç½é¡µæappï¼è¯·çè¿é¨åçæç¨ã
ç¨æ³
body
divclass="container"
...
/div
/body
解é
bootstrap.cssï¼ä½äºbootstrapç主æ件夹çdocs\assets\cssä¸ï¼ç第å°è¡ï¼ä¸ºå建主容å¨æ¸²ææ ·å¼ï¼ä»èå建ä¸ä¸ªåºå®å¸å±ãåºå®å¸å±çç®çæ¯ä¸ºç½é¡µæappå建ä¸ä¸ªåç´ ï¼é»è®¤ï¼å®½çå¸å±ã
Bootstrapåºå®å¸å±çå®ä¾
ä¸é¢ç代ç å建ä¸ä¸ªç½é¡µåºå®å¸å±ã为äºå®å¶ï¼é¤äºé»è®¤æ ·å¼ï¼è¿éå建ä¸ä¸ªæ°çcssæ件example-fixed-layout.cssï¼ä¸bootstrap.cssä½äºåä¸ä¸ªæ件夹ä¸ã
CSS代ç
body{
padding-top:px;
padding-bottom:px;
}
.navli{
padding-top:5px;
}
.leaderboard{
padding:px;
margin-bottom:px;
background-image:url('/twitter-bootstrap/images/gridbg.gif');
background-repeat:repeat;
-webkit-border-radius:6px;
-moz-border-radius:6px;
border-radius:6px;
}
.leaderboardh1{
font-size:px;
margin-bottom:5px;
line-height:1;
letter-spacing:-1px;
color:#FF;
}
.leaderboardp{
font-size:px;
font-weight:;
line-height:px;
}
layeruiåbootstrapçå¼åæåªäºï¼
boostrapå½å¤çå端æ¡æ¶ï¼æ¯è¾æçäºï¼å¹¶ä¸å ¼å®¹å¤ç§è®¾å¤ï¼èªéé æ¯è¾å¥½ï¼ç»ä»¶æ¯layuiæ¼äº®ç¹
layuiæ¯å½äººå¼åçï¼è¿å¤äºå¼åé¶æ®µï¼å¹¶ä¸æ¯å®å ¨æççå端uiæ¡æ¶ï¼åç¡®å°è¯´ï¼å¥¹æ´å¤æ¯ä¸ºæå¡ç«¯ç¨åºåé身å®åï¼ä½ æ éæ¶è¶³åç§åç«¯å·¥å ·çå¤æé ç½®ï¼åªéé¢å¯¹æµè§å¨æ¬èº«ï¼è®©ä¸åä½ æéè¦çå ç´ ä¸äº¤äºï¼ä»è¿éä¿¡æææ¥ã
psï¼æ¯layuiï¼layeræ¯layuiçä¸ä¸ªæ¨¡å为弹çªæ¨¡å
bootstrapålayerç¨åªä¸ªå¥½ï¼ä¸å类弹åºå±ç»ä»¶ç¸æ¯ï¼layerçä¼å¿ææ¾ã
Bootstrapålayerå¸å±
Bootstrapåºå®å¸å±
使ç¨Bootstrapå·¥å ·å æ¥å建åºå®å¸å±åæµå¨å¸å±ãæç¨æ¯åºäºBootstrapçæ¬2.0ãå¨çæ¬2.0ä¸ï¼Bootstrap为ææºãå¹³æ¿çµèãç¬è®°æ¬ãå°åå°å¼æºã大å宽å±å°å¼æºçæ·»å äºååºç¹æ§ãå¯ä»¥éè¿å页é¢æ·»å bootstrap-responsive.cssæ件ï¼ä½äºdocs\assets\cssä¸ï¼æ¥è®©å¸å±å ·æååºæ§ã
layerå¼¹çª
layerï¼ä¸ä¸ªå¯ä»¥è®©ä½ æ³å°å³å¯åå°çwebå¼¹çª(å±)解å³æ¹æ¡(jsç»ä»¶)ï¼ä½è è´¤å¿(å端å¼åå·¥ç¨å¸)ãlayer侧éäºç¨æ·çµæ´»çèªå®ä¹ï¼ä¸ºä¸å人ç使ç¨ä¹ æ¯æä¾å¨åãå ¶æä¹å¨äºï¼å¯ä»¥è®©æ¨ç页é¢æ¥ææ´ä¸°å¯ä¸ä¾¿æ·çæä½ä½éªï¼èæ¨åªéå¨è°ç¨æ¶ç®åå°é ç½®ç¸å ³åæ°ï¼å³å¯è½»æ¾å®ç°ã
Bootstrapï¼æ¥èªTwitterï¼æ¯ç®åå¾å欢è¿çå端æ¡æ¶ãBootstrapæ¯åºäºHTMLãCSSãJavaScriptçï¼å®ç®æ´çµæ´»ï¼ä½¿å¾Webå¼åæ´å å¿«æ·ãå®ç±Twitterç设计å¸MarkOttoåJacobThorntonåä½å¼åï¼æ¯ä¸ä¸ªCSS/HTMLæ¡æ¶ã
Bootstrapæä¾äºä¼é çHTMLåCSSè§èï¼å®å³æ¯ç±å¨æCSSè¯è¨LessåæãBootstrapä¸ç»æ¨åºåé¢å欢è¿ï¼ä¸ç´æ¯GitHubä¸ççé¨å¼æºé¡¹ç®ï¼å æ¬NASAçMSNBC(å¾®è½¯å ¨å½å¹¿æå ¬å¸)çBreakingNewsé½ä½¿ç¨äºè¯¥é¡¹ç®ãå½å ä¸äºç§»å¨å¼åè è¾ä¸ºçæçæ¡æ¶ï¼å¦WeX5å端å¼æºæ¡æ¶çï¼ä¹æ¯åºäºBootstrapæºç è¿è¡æ§è½ä¼åèæ¥ã
PyTorch 源码分析(三):torch.nn.Norm类算子
PyTorch源码详解(三):torch.nn.Norm类算子深入解析
Norm类算子在PyTorch中扮演着关键角色,它们包括BN(BatchNorm)、LayerNorm和InstanceNorm。1. BN/LayerNorm/InstanceNorm详解
BatchNorm(BN)的核心功能是对每个通道(C通道)的数据进行标准化,确保数据在每个批次后保持一致的尺度。它通过学习得到的代源码电影在线gamma和beta参数进行缩放和平移,保持输入和输出形状一致,同时让数据分布更加稳定。 gamma和beta作为动态调整权重的参数,它们在BN的学习过程中起到至关重要的作用。2. Norm算子源码分析
继承关系:Norm类在PyTorch中具有清晰的继承结构,子类如BatchNorm和InstanceNorm分别继承了其特有的功能。
BN与InstanceNorm实现:在Python代码中,BatchNorm和InstanceNorm的实例化和计算逻辑都包含对输入数据的2D转换,即将其分割为M*N的矩阵。
计算过程:在计算过程中,首先计算每个通道的均值和方差,这是这些标准化方法的基础步骤。
C++侧的retrofit源码在线阅读源码洞察
C++实现中,对于BatchNorm和LayerNorm,代码着重于处理数据的标准化操作,同时确保线程安全,通过高效的数据视图和线程视图处理来提高性能。Drawableåç±»ä¹ââLayerDrawable ï¼å¾å±å å ï¼
LayerDrawable对åºçXMLçæ ¹å ç´ æ¯<layer-list>,ï¼å®ä½¿ä¸ç§å±æ¬¡åæ¾ç¤ºçDrawableéåãä¹å°±è¯´ï¼å¯ä»¥éè¿æ¾ç¤ºç±å¤ä¸ªDrawableçå å ï¼æ转ï¼ä½ç§»çç»åæ¾ç¤ºåºä¸åä¸Drawableä¸åçææãå¨æ¬æä¸æ们ä¼éä¸ç¸å ³çææãæ ¹æ®å®ç½æ¾ç¤ºå®çè¯æ³å¦ä¸ï¼
åèç¹æè¿ä¹å 个ï¼drawableãidãï¼å个æ¹åï¼topãrightãbuttomåleftã
ï¼å ³äºè¿å个æ¹åå¯ä»¥å¤§æ¦ç解为paddingï¼åä½ä¸ºpxï¼
对äºLayerDrawableæè¿ä¹å 个ç¹ç¹
1ãæ¯ä¸ä¸ªitem表示ä¸ä¸ªDrawable
2ãä¸é¢çDrawaleè¦çä¸é¢çDrawable
3ãiteméé¢å¸¸è§æ¾çæ¯bitmapï¼å½ç¶ä¹å¯ä»¥æ¯shapeï¼ä¸ç®¡æ¯ä»ä¹è¯å®æ¯Drawableã
è³æ¤ææå±ç¤ºå®æã
å¨è¿éæä¸ç¹ï¼æ们ä¸è¬åè¯ä»·çææä¹éè¦å©ç¨LayerDrawableï¼è¿éå°±ä¸éä¸æºç äºï¼è¿ä¸ªç½ä¸æ¸¸å¾å¤åèã
.
.
.
.
å®è·µ
.
.
åçï¼ä»¥åºè¾¹ä¸ºä¾
äºè§£æ´å¤çDrawableåç±» Drawableå¾åèµæºæ½è±¡ç±»
æ¬ç¯å®ã
ç¸å ³åèï¼
ãandroidå¼åèºæ¯æ¢ç´¢ã
ç¨layer-listå®ç°å¾çæ转å å ãéä½å å ãé´å½±ãæé®æ示ç¯
bootstrapålayerç¨åªä¸ª
ä¸å类弹åºå±ç»ä»¶ç¸æ¯ï¼layerçä¼å¿ææ¾ã
Bootstrapålayerå¸å±Bootstrap åºå®å¸å±
ä½¿ç¨ Bootstrap å·¥å ·å æ¥å建åºå®å¸å±åæµå¨å¸å±ãæç¨æ¯åºäº Bootstrap çæ¬ 2.0ãå¨çæ¬ 2.0 ä¸ï¼Bootstrap 为ææºãå¹³æ¿çµèãç¬è®°æ¬ãå°åå°å¼æºã大å宽å±å°å¼æºçæ·»å äºååºç¹æ§ãå¯ä»¥éè¿å页é¢æ·»å bootstrap-responsive.css æ件ï¼ä½äº docs\assets\css ä¸ï¼æ¥è®©å¸å±å ·æååºæ§ãlayerå¼¹çªlayerï¼ä¸ä¸ªå¯ä»¥è®©ä½ æ³å°å³å¯åå°çwebå¼¹çª(å±)解å³æ¹æ¡(jsç»ä»¶)ï¼ä½è è´¤å¿(å端å¼åå·¥ç¨å¸)ãlayer侧éäºç¨æ·çµæ´»çèªå®ä¹ï¼ä¸ºä¸å人ç使ç¨ä¹ æ¯æä¾å¨åãå ¶æä¹å¨äºï¼å¯ä»¥è®©æ¨ç页é¢æ¥ææ´ä¸°å¯ä¸ä¾¿æ·çæä½ä½éªï¼èæ¨åªéå¨è°ç¨æ¶ç®åå°é ç½®ç¸å ³åæ°ï¼å³å¯è½»æ¾å®ç°ã
Bootstrapï¼æ¥èª Twitterï¼æ¯ç®åå¾å欢è¿çå端æ¡æ¶ãBootstrap æ¯åºäº HTMLãCSSãJavaScript çï¼å®ç®æ´çµæ´»ï¼ä½¿å¾ Web å¼åæ´å å¿«æ·ã å®ç±Twitterç设计å¸Mark OttoåJacob Thorntonåä½å¼åï¼æ¯ä¸ä¸ªCSS/HTMLæ¡æ¶ã
Bootstrapæä¾äºä¼é çHTMLåCSSè§èï¼å®å³æ¯ç±å¨æCSSè¯è¨LessåæãBootstrapä¸ç»æ¨åºåé¢å欢è¿ï¼ä¸ç´æ¯GitHubä¸ççé¨å¼æºé¡¹ç®ï¼å æ¬NASAçMSNBC(å¾®è½¯å ¨å½å¹¿æå ¬å¸)çBreaking Newsé½ä½¿ç¨äºè¯¥é¡¹ç®ã å½å ä¸äºç§»å¨å¼åè è¾ä¸ºçæçæ¡æ¶ï¼å¦WeX5å端å¼æºæ¡æ¶çï¼ä¹æ¯åºäºBootstrapæºç è¿è¡æ§è½ä¼åèæ¥ã
FasterTransformer Decoding 源码分析(三)-LayerNorm介绍
本文深入探讨FasterTransformer中LayerNormalization(层归一化)的源码实现与优化。作为深度学习中的关键技术,层归一化可确保网络中各层具有相似的分布,从而加速训练过程并改善模型性能。背景介绍部分详细解释了层归一化的工作原理,强调其在神经网络中的高效并行特性与广泛应用。文章从代码起点开始剖析,具体路径位于解码过程的核心部分。调用入口展示了传入参数,包括数据描述和关键参数gamma、beta、eps,简洁直观,符合公式定义。连点工具 源码深入源码的解析揭示了优化点,特别是针对特定数据类型和维度,使用了定制化内核。此设计针对高效处理半精度数据样本,减少判断指令,实现加速运算,且对偶数维度数据进行调整以最大化Warp特性利用。接下来,内核实现的详细描述,强调了通过共享内存与block、warp级归约实现公式计算的高效性。这部分以清晰的代码结构和可视化说明,解释了块级别与Warp级归约在单个块处理多个数据点时的协同作用,以及如何通过巧妙编程优化数据处理效率。文章总结了FasterTransformer中LayerNormalization的整体优化策略,强调了在CUDA开发中基础技巧的应用,并指出与其他优化方案的比较。此外,棋牌源码开发技巧文章还推荐了OneFlow的性能优化实践,为读者提供了一个深入探索与对比学习的资源。
openlayers4 入门开发系列之地图切换篇(附源码下载)
开放层4入门开发系列之地图切换篇
1.基于开放层4实现地图切换效果
2.源代码demo下载
开放层4地图切换篇的核心是使用开放层4来加载不同类型的地图服务,实现地图切换功能,下图展示了效果:
核心应用到开放层4的核心类如下:
1.开放层4加载瓦片地图类,详情见官方API说明,包含函数、属性及事件等。
2.开放层4的ol.layer.Tile加载瓦片XYZ目录访问数据源,详情见官方API说明。
3.开放层4加载ArcGIS Rest服务地图服务数据源,详情见官方API说明。
4.开放层4加载ArcGIS Rest服务地图服务数据源,详情见官方API说明。
5.开放层4加载WMS瓦片服务地图数据源,详情见官方API说明。
6.开放层4加载OSM在线地图数据源,详情见官方API说明。体检报告系统源码
地图切换篇的核心代码实现流程如下:
1.地图配置参数说明:server:地图服务类型,当前参数值包括geoserver、arcgisserver、osm、gaode、tianditu,分别代表geoserver服务、arcgis服务器服务、OSM在线地图、高德地图、天地图。
2.开放层4加载arcgis服务器地图服务。
3.开放层4加载OSM在线地图服务。
4.开放层4加载天地图在线地图服务。
5.开放层4加载高德在线地图服务。
6.开放层4加载第三方arcserverrest服务的离线瓦片。
7.开放层4加载arcserverrest的本地切片,加载arcserver本地切片时,其resolutions、origin、extent的设置与上述一致。arcserver切片也是xyz排列存储。
感兴趣的伙伴们,私聊我获取源代码,价格为8.8元。
layeruiå¦ä½ä½¿ç¨LayerUI
lauiçåºæ¬ç¨æ³ä»ç»æ¹æ³:layui.define([mods]ï¼åè°)LocalStorageæ¯å¯¹æ¬å°åå¨åsessionStorageçå好å°è£ ï¼å¯ä»¥æ´æ¹ä¾¿å°ç®¡çæ¬å°æ°æ®ã
LocalStorageæä¹ åå¨:layui.data(tableï¼settings)ï¼é¤éç©çå é¤ï¼å¦åæ°æ®å°æ°¸è¿åå¨ã
sessionstoragesessionstorage:layui.sessiondata(tableï¼settings)ï¼å ³é页é¢æ¶ä¼å¤±æã注æ:laui2.2.5æ¯æ°çã
layui.device(å¯é¥)
æ¹æ³/å±æ§æè¿°
Layui.cacheéæå±æ§ãè·åä¸äºé ç½®å临æ¶ç¼åä¿¡æ¯ã
Layui.extend(options)æ©å±æ¨¡åå«åï¼å¦layui.extend({ test:/RES/js/test})
éålayui.each(objï¼fn)对象(æ°ç»ï¼å¯¹è±¡ï¼DOM对象çã)ï¼å¯ä»¥ç¨æ¥æ¿æ¢forè¯å¥ã
Layui.getStyle(nodeï¼name)è·åä¸ä¸ªåå§DOMèç¹çæ ·å¼å±æ§å¼ï¼æ¯å¦:Layui.getstyle(document.bodyï¼font-size)
layui.img(url,callback,error)å¾çé¢å è½½Layui.img(urlãåè°ãé误)å¾åé¢å è½½
Layui.sort(objï¼keyï¼desc)æ ¹æ®æ个æå对æ°ç»ä¸ç对象è¿è¡éæ°æåºï¼æ¯å¦:Layui.sort([{ a:3}ï¼{ a:1}ï¼{ a:5}]ï¼ä¸)
Layui.router()è·ålocation.hashè·¯ç±ï¼ä½ç®åå¨Layuiä¸ä¸èµ·ä½ç¨ã对äºå页åºç¨ç¨åºæ¥è¯´ï¼å®ä¼å¾æ¹ä¾¿ã
Layui.hint()å°ä¸äºå¼å¸¸ä¿¡æ¯æå°å°æ§å¶å°ï¼åªæerroræ¹æ³:layui.hint()ãé误(é误)
é²æ¢äºä»¶å泡ã
Layui.onevent(modnameï¼eventsï¼callback)èªå®ä¹æ¨¡åäºä»¶ï¼å±äºæ¯è¾é«çº§çåºç¨ãæå ´è¶£çåå¦å¯ä»¥ççlayui.jsçæºä»£ç å表å模åã
Layui.event(modnameï¼eventsï¼params)æ§è¡èªå®ä¹æ¨¡åäºä»¶ï¼å¹¶ä¸oneventä¸èµ·ä½¿ç¨ã
layui.factory(modName)ç¨äºè·å模å对åºçå®ä¹åè°å½æ°ã
å¨æ¨¡å空ä¹é´å½å
layuiç模åæ¥å£å°è¢«ç»å®å¨layui对象ä¸ï¼å ¶å é¨ç±layui.define()æ¹æ³å®æãæ¯ä¸ªæ¨¡åå°æä¸ä¸ªå¯ä¸çå称ï¼ä¸è½è¢«å ç¨ãæä»¥ä½ ä¸éè¦æ å¿æ¨¡åç空æ¿é´è¢«æ±¡æï¼é¤éä½ ä¸»å¨å äºæuiã{ 模åå称}ãå¯ä»¥éè¿layui.useæ¹æ³è°ç¨æ¨¡åï¼ç¶åéè¿layui对象è·å模åæ¥å£ã
å¦ä½ä½¿ç¨å é¨jQuery
//主å¨å è½½jquery模å
layui.use([jqueryå±]ï¼å½æ°(){
Var//å ³é®ç¹
ï¼layer=layui.layer
//å°±åä½ å¹³æ¶ç¨jQueryä¸æ ·ã
$(æ£æ).追å (ä½ å¥½jquery
});
pså¦ä½å¿«éæ¢åºç²¾è´ï¼
åå§ç©ä½æ®µæ°ç°å·²ç»è½ä¿®æ¹å å·²ç»å»ºå¥½æ¨¡ååä¿®æ¹å级段æ°ä¼ä½¿æ¨¡ååºç°é误ç´æ¥éæ©è§å¾å¤ªéå©è¾¹ç¼çº¿EditMeshééæ©Bevelå½ä»¤ä¹åè§ä½¿äºéå©å¤åæ»è¾¹è§åæ»ç¹å¼é¢æ¹æ ¼æ¥è°æ´åè§æ®µæ°å大å°ä¹å³è¾¹å±æ§æ éè°èoffset大å°Segments段æ°å ¶å®ä¹èªå·±è¯ä¸å°å¿æå±æ§æ å ³æDisplay-UIElements--ChannelBox/LayerEditoræé©å¼å¯å±æ§æ äºPS.æç¨ç¥éç¨ææåªåäºæ没ç¨è¿æè§å¾åºè¯¥ä¹ä¼å·®å¤å§
iOS7appstore带边æ¡çæé®æ¯æä¹å®ç°çï¼
å¯ä»¥ç¨viewçlayerå±æ§æ¥åçãå¦æåªæ¯ç®åå°å ä¸ä¸ªè¾¹æ¡çè¯ï¼å¯ä»¥è¿æ ·ï¼
UIButton*yourButton=;
//åå§åå·¥ä½ï¼è®¾ç½®æåï¼frameççï¼ç¥
//æé®è¾¹æ¡å®½åº¦
yourButton.layer.borderWidth=1.5;
//设置åè§
yourButton.layer.cornerRadius=4.5;
//设置é¢è²ç©ºé´ä¸ºrgbï¼ç¨äºçæColorRef
CGColorSpaceRefcolorSpace=CGColorSpaceCreateDeviceRGB();
//æ°å»ºä¸ä¸ªçº¢è²çColorRefï¼ç¨äºè®¾ç½®è¾¹æ¡ï¼å个æ°ååå«æ¯r,g,b,alphaï¼
CGColorRefborderColorRef=CGColorCreate(colorSpace,(CGFloat){ 1,0,0,1});
//设置边æ¡é¢è²
yourButton.start.layer.borderColor=borderColorRef;
å¦å¤ï¼è¿éæä¸ä¸ªç²¾å½©çä¾åï¼æ¨èä¸ä¸ï¼
/ios/UIButton-Bootstrap/e8cfab
osç³»ç»æ¶æï¼
第ä¸ãæä½ç³»ç»å±ï¼OSï¼
第äºãåç§åºï¼Librariesï¼åAndroidè¿è¡ç¯å¢ï¼RunTimeï¼
第ä¸ãåºç¨ç¨åºæ¡æ¶ï¼ApplicationFrameworkï¼
第åãåºç¨ç¨åºï¼Applicationï¼
正点原子lwIP学习笔记——网络数据包管理
TCP/IP作为一种数据通信机制,其协议栈的实现本质上是对数据包的处理。为了实现高效率的处理,lwIP数据包管理提供了一种高效的机制。协议栈各层能够灵活处理数据包,同时减少数据在各层间传递时的时间和空间开销,这是提高协议栈工作效率的关键。在lwIP中,这种机制被称为pbuf。
用户的数据经过申请pbuf,拷贝到pbuf结构的内存堆中。在应用层,数据的前面加上应用层首部,在传输层加上传输层首部,最后在网络层加上网络层首部。
pbuf用于lwIP各层间数据传递,避免各层拷贝数据!
lwIP与标准TCP/IP协议栈的区别在于,lwIP是一种模糊分层的TCP/IP协议,大大提高了数据传输效率!
这是定义在pbuf.h中的关键结构体pbuf。通过指针next构建出了一个数据包的单向链表;payload指向的是现在这个结构体所存储的数据区域;tot_len是所有的数据长度,包括当前pbuf和后续所有pbuf;而len就是指当前pbuf的长度;type_internal有四种类型;ref代表当前pbuf被引用的次数。
右边展示的pbuf_layer就是用来首部地址偏移,用来对应相应的结构体。
PBUF_RAM采用内存堆,长度不定,一般用在传输数据;PBUF_POOL采用内存池,固定大小的内存块,所以分配速度快(一般字节,就是分配3个PBUF_POOL的内存池),一般用在中断服务中;PBUF_ROM和PBUF_REF都是内存池形式,而且只有pbuf没有数据区域,数据都是直接指向了内存区(PBUF_ROM指向ROM中,PBUF_REF指向RAM中)。
左边第一幅对应PBUF_RAM;中间两幅对应PBUF_POOL;最后一幅对应PBUF_ROM和PBUF_REF。
其中PBUF_RAM和PBUF_POOL相对更为常用。
更多的函数,都可以在pbuf.c和.h中找到。pbuf_alloc()如果是PBUF_REF或者是PBUF_ROM,就会如上图所示,创建一个结构体指针p,然后会进入pbuf_alloc_reference;该函数中,会申请一个pbuf结构体大小的内存;然后调用pbuf_init_alloced_pbuf进行初始化,初始化可以如上图所示。
如果是PBUF_POOL,会定义q和last两个pbuf结构体指针,q和last都初始化为NULL,rem_len(剩余长度)初始化为(用户指定需要构建的长度);然后q会经过内存申请,qlen则是去rem_len和当前可申请的数据大小(PBUF_POOL_BUFSIZE_ALIGNED - LWIP_MEM_ALIGN_SIZE(offset))取小值,然后同样经过pbuf_init_alloced_pbuf初始化q中的pbuf结构体;然后会把offset清零,就是说之后的pbuf都没有offset了,只有第一个链表的元素有offset;经过if判断并判断rem_len的大小,只要还有剩余就会回去循环继续执行上述操作,直到完成3个内存块的初始化。
首先会计算payload_len和alloc_len,如果是传输数据,那么LWIP_MEM_ALIGN_SIZE(offset)就是,计算得到payload_len=,alloc_len=;然后进入判断payload和alloc的长度是否
进入判断p是否为空,不为空证明还没有释放;进入while语句,每一次都--ref(引用次数);然后类似链表删除,调用相应的pbuf类型的内存释放(内存堆或者内存池),直到p全部被释放。源码如下:
这个就要看你使用的是什么类型,然后会根据类型来决定payload_len的大小,进行相应的payload指针指向数据区前的首部字段。
这一章主要讲述了lwIP中重要的pbuf缓冲,具体有哪些数据构成,为之后的学习奠定基础,确定了pbuf除了所需传输的数据,还有哪些变量需要添加,如何申请对应的pbuf内存大小,以及对应的内存堆和内存池。