SE反烏龜
SF解鎖SGBBCall
SD 飛行模式
關於我 : Kun-hsien(KH)
研究&開發是一段艱難的旅程:享受在資料字串與信號間遊走。
從VB->HTML->PHP->MySQL->Fedora->MCSE->JAVA->XML->Android->Embeded C->C ->C# ->Python-> Arduino -> IoT ->MQTT ->Spark ->CAN ->I2C->無人機....
這裡除了紀錄開發Apps遇到問題的Solution並分享給大家外,各種開發技術的文章也在此探討!希望大家都能順利解決自己遇到的問題!
第二台 2.5吋圈機天花板 怪象25 Pro (Oddity XI25 Pro)
飛控 : F722 40A AIO 3~6S
機架 : Oddity XI25
電機 : Spinnybois-1405 4800KV Mortor 4S
槳葉 : Gemfan 乾豐 D63-3(三槳) 2.5寸涵道機螺旋槳
圖傳 : DJI O4 lite
電池 : 格氏4S 850mA 150C 14.8V TATTU電芯
goggles :
重新刷機必備工具 :
https://impulserc.com/pages/downloads
電機修正
https://www.bilibili.com/video/BV11u411S7MU/?spm_id_from=333.337.search-card.all.click
下命令 resource
可以看到飛控板的各項設定 其中最前方可以看到mortor部分
下指令調換電機
resource motor 1 Bxx
resource motor 2 Bxx
resource motor 3 Axx
resource motor 4 Axx
設定好之後輸入save就會存檔
20250721 飛控板刷韌體
Survey資料 : https://manuals.plus/zh-TW/hglrc/hglrc-zeus-f722-flight-controller-manual
在焊接完之後調整電機 (電調) 時 突然沒辦法接上線 => Betaflight 無法偵測到 COM port
Step1.上網查詢後發現只需要下載 "impluseRC_driver fixer"工具
Step2.再執行工具之間先進入刷機模式
Step3.長按飛控板端的button鍵並上電再執行impluseRC_driver_fix
Step4.接下來在Betaflight 的裝置中使用連接頁籤選擇DFU模式
Step5.廠商driver選擇 OddityF7系列後執行線上下載並連接上
Step6.開始燒錄,燒錄完後MCU會自動重啟 這時候Betaflight應該能自動抓到COM port
即可進行下一階段調校
接收機查詢規格 : https://oscarliang.com/
目前驗證可用之接收機
frsky-r-xsr
20250810更新 遙控器可以連上Oddity XI25 Pro 了 關鍵點如下
重新燒寫時記得使用SBUS
自從考取無人機普通操作證後
買了一台Holybro的x500 v2(23000)來自我研究
目前買了8000mAh 90C(1700元)電池與塔圖TATTU - 1500mAh(9xx元)
準備當其主要電池與備用電池,在確定自己可以起飛之前就先這樣了
接收機 使用 radiomaster的V86 c2 (390)並已在 25/7/7 跟遙控器 radiomaster S16 MKII (6300)配對上
太過近時會出現通訊中斷的警告 = > (尚須分析)
接下來我想就是QGroundControl與Mission Planner的配置 還有遙控器的對頻與起飛設定了
我想這個就是調參(參數調整)吧
Poco::Data::SQLite::Connector::registerConnector();
// 建立会话
Session session("SQLite", "sample.db");
// 如果有名為abc的表存在,删除
session << "DROP TABLE IF EXISTS abc", now;
// 創建Table
session << "CREATE TABLE abc (Name VARCHAR(30), Address VARCHAR, Age INTEGER(3))", now;
Statement insert(session);
//塞一筆資料 #略#
for(int i=0; i<=65535; i++)
{
insert << "INSERT INTO abc VALUES(?, ?, ?)",use(abc.name),use(abc.address),use(abc.age);
//在這裡每插入一筆資料 必須使用insert.exexute(); 並執行execute方法
insert.execute();
}
當使用for loop 時 insert必須都在括弧內宣告及處理,execute使用for loop會造成效能低下
65536筆跑完必須耗時10分鐘
有關于SQLite批量寫入資料耗時的問題有很多帖子可以找
我找到這篇Reference : https://blog.darkthread.net/blog/sqlite-insert-slow/
在UnitTest時 為了達到65536筆資料來滿足line coverage必須花不少時間,因此需要介紹以下的批量寫入
在訪問了Bing大神後(Bing也有推薦此篇文章 : Poco插入大量数据到数据库的优化 | xilixili.net),有找到一種寫法 說是批量寫入需要靠"事務"進行優化
其範例程式碼如下 :
Poco::Data::Session sess("SQLite", "test.db");
sess << "create table if not exists test ("
" [col_a] NVARCHAR (256) NOT NULL,"
" [col_b] NVARCHAR (256) NOT NULL)",
Poco::Data::Keywords::now;
sess.begin(); <=============================重點在這兩筆
for (size_t i = 0; i < 65535; i++) {
char bufa[64] = {0};
char bufb[64] = {0};
sprintf(bufa, "test col a %d %d", i, rand());
sprintf(bufb, "test col b %d %d", i * 2, rand());
sess << "insert into test (col_a,col_b) values (?,?)",
Poco::Data::Keywords::use(bufa),
Poco::Data::Keywords::use(bufb),
Poco::Data::Keywords::now;
}
sess.commit(); <=============================重點在這兩筆中間筆數內的詳細資訊可以略過,因個人專案不同而已 當使用for loop進行插入前後必須宣告
sess.begin(); 以及 sess.commit(); 便可快速且大量塞入資料至Poco資料庫SQLite中推薦閱讀書單&網路資源
2.C++ Standard Library headers
字串
reference : https://shengyu7697.github.io/std-string-substr/
using std::string;
std::string::substr 取出子字串
範例 : substr(從第幾個字節之後開始,的多少個字截截取)
std::string abc_str = "hello"
abc_str.substr(1); //扣掉第一個印出後面的 ello
abc_str.substr(1,2); //扣掉第一個印出後面兩個 el
string m("ssx"); == string m = "ssx";
>> //input
<< //Output message
endl = println = \n
abcManager::abcManager(Poco::Logger &L):_logger(L)
初始化
資料型別
using namespace std; //引入標準類別庫 可使用string => std::string aa = "";
using namespace xxx::yyy
也可寫成
using xxx:yyy
nullptr : 指標字面值
指標宣告
1.shared_ptr宣告方法
reference :https://cplusplus.com/reference/memory/shared_ptr/operator%20bool/
h檔全宣告方式std::shared_ptr<CppObjName> abc = std::shared_ptr<CppObjName>();
h檔半宣告方式std::shared_ptr<CppObjName> abc;
cpp檔 new : abc = std::shared_ptr<CppObjName>();
abc = NULL;
p_ptr* = NULL;
2.auto_ptr宣告方法
reference :https://openhome.cc/Gossip/CppGossip/autoPtr.html
3.h檔宣告
h檔半宣告 : abc* a;
cpp檔 new : a = new abc();
Description Resource Path Location Type Ld error: section .stack VMA [20002c00,20002fff] overlaps section .heap VMA Meter_AS_MCU C/C++ Problem
"c:/nxp/s32ds_arm_v2.2/s32ds/build_tools/gcc_v6.3/gcc-6.3-arm32-eabi/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/bin/real-ld.exe: section .stack VMA [20002d00,20002fff] overlaps section .heap VMA [20002a58,20002d57]"
這問題描述主要說的是./stack跟heap去重疊到
導致編譯錯誤
解法如下 :
開啟S32 Design Studio 開啟專案的Project Settings->Linker files
點選S32K1xx_32_ram.ld
HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x00000400;
STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x00000400;
並在以下資料夾入前綴 : __attribute__ ((section(".data"))) 如下 :
__attribute__ ((section(".data")))m_interrupts (RX) : ORIGIN = 0x1FFFC000, LENGTH = 0x00000400
__attribute__ ((section(".data")))m_text (RX) : ORIGIN = 0x1FFFC400, LENGTH = 0x00003C00
/* SRAM_U */
__attribute__ ((section(".data")))m_data (RW) : ORIGIN = 0x20000000, LENGTH = 0x00003000
接著在S32K1xx_32_flash.ld
動態調整heap size跟stack size 如下 :
HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x00000300;
STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x00000300;
即可解決
另一種暴力的方式如下 :
#define VAR_PUT_IN_DATA_SECTION __attribute__((section(".data")))
開機的順序為bootloader->u-boot
bootloader 可以想像成是PC開機到windows前的GRUB開機管理程式
ARM 結構的 CPU 會從位址 0x00000000 開始執行
但是bootloader是更底層
Bootloader會針對SoC的clock rate做初始化 以及Ram的初始化
透過memory map執行跳躍到u-boot區段
其中記錄開機後bootloader載入的區段,接著u-boot 是linux提前載入的程式階段在此階段會存在很多小工具讓使用診進行診斷或使用 - busybox。
其主要程式為Start.s,分為boot loading模式及下載模式,下載模式可使用一些指令下載,如xmodem, tftp, usb等 並將其存至Ram或Flash固存中。其中透過調用lowlevel_init.S的lowlevel_init進行u-boot相關的低階初始化。
接著跳轉到kernel 這段就是linux的核心層 也就是linux最基礎的功能包含driver的環境
kernel層完之後會根據參照及傳遞值跳躍到application層。
一但到application層即代表 已經開至Userspace上層
https://www.twblogs.net/a/5d1b5c70bd9eee1e5c8311ef
Stack 與 Heap 皆為C語言中處理底層記憶體的技術
Stack是有順序的疊加
Heap則會找空的疊加
Heap需要考慮到空間釋放的問題 (GC回收機制)
Reference : 如何在Windows 10下合併多個MP4檔案的字幕和影片 - 銳力電子實驗室 (reneelab.net)
Step1 : cd D:
Step2 : cd ffmpeg/
Step3 : cd bin/
Step4 : ffmpeg.exe -i D:/1.mp4 –f mpeg D:/1.mpg
Step5 : ffmpeg.exe -i D:/2.mp4 –f mpeg D:/2.mpg
Step6 : cd ../../
Step7 : copy /b “D:/1.mpg”+”D:/2.mpg” “D:/3.mpg”
Step8 : ffmpeg.exe -i D:/3.mpg -f mp4 D:/3.mp4