ubuntu安装docker,及将一个py文件打包成docker镜像并运行完整流程
专æ �å¯¼è¯»ä½ æ˜¯å�¦é�‡åˆ°è¿‡è¿™ç§�崩溃ç�¬é—´äº§å“�å�–ç»™ A 客户è¦�用 Modbus å��è®®å�–ç»™ B 客户è¦�用ç§�有å��è®®å�–ç»™ C 客户è¦�åŠ å¯†ä¼ è¾“ã€‚ä½ çš„ä»£ç �里是ä¸�是充斥ç�€æ— æ•°çš„#ifdef CUSTOMER_A或者if (mode
ç–略模å¼�æ•™ä½ ç”¨ C è¯è¨€å®�ç�°â€œå¤šæ€�â€�让算法åƒ� USB è®¾å¤‡ä¸€æ ·æ�’上就能用拔æ�‰å°±æ¶ˆå¤±ã€‚
场景还å�Ÿ (The Pain)å�‡è®¾ä½ æ£åœ¨ç»´æŠ¤ä¸€æ¬¾æ™ºèƒ½é—¨é”�ã€‚æ ¸å¿ƒåŠŸèƒ½æ˜¯â€œéªŒè¯�密ç �â€�。 èµ·åˆ�å�ªéœ€è¦�简å�•çš„æ˜�文比对。å��æ�¥é«˜é…�ç‰ˆåŠ å…¥äº†æŒ‡çº¹Hash æ ¡éªŒæµ·å¤–ç‰ˆè¦�求符å�ˆå®‰å…¨è§„范CRC32 或 AES。è�œé¸Ÿçš„写法æ�¡ä»¶åˆ¤æ–的地狱typedef enum { AUTH_SIMPLE, AUTH_CRC32, AUTH_HASH } AuthMode;bool Verify_Password(uint8_t* input, uint8_t* stored, int len, AuthMode mode) {if (mode AUTH_SIMPLE) {// æ˜�文比对return (memcmp(input, stored, len)
;}else if (mode AUTH_CRC
{// 还è¦�å�»åŒ…å�« CRC 的头文件耦å�ˆä¸¥é‡�uint32_t crc_in Cal_CRC32(input, len);uint32_t crc_store *(uint32_t*)stored;return (crc_in crc_store);}else if (mode AUTH_HASH) {// ... å�ˆæ˜¯ä¸€å¤§å�¨ä»£ç � ...}return false;}æ�¶æ�„师的审视这ç§�代ç �è¿�å��了设计模å¼�的最高天æ�¡å¼€é—å�Ÿåˆ™ (Open-Closed Principle)—— 对扩展开放对修改关é—。耦å�ˆè¿‡é‡�Verify_Password函数必须认识所有的算法。如æ�œä½ è¦�åŠ ä¸€ä¸ªæ–°çš„â€œè§†ç½‘è†œæ‰«æ��â€�ä½ å¾—ä¿®æ”¹è¿™ä¸ªç»�过测试的稳定函数万一改å��了旧功能也挂了。代ç �臃肿ä½�é…�版芯片 Flash å�ªæœ‰ 32KBæ ¹æœ¬è£…ä¸�下 AES åº“ä½†å› ä¸ºå†™åœ¨ä¸€ä¸ªæ–‡ä»¶é‡Œé“¾æ�¥å™¨å¾ˆéš¾å‰¥ç¦»æœªç”¨åˆ°çš„代ç �除é��编译器优化æ��强。
模å¼�图解 (The Concept)ç–略模å¼�çš„æ ¸å¿ƒæ˜¯å°†**“å�šä»€ä¹ˆâ€� (Interface)** 和“æ€�么å�šâ€� (Implementation)分离。Context (ç�¯å¢ƒ)æŒ�有算法的指针ä¸�关心具体是哪个算法。Strategy (æ�¥å�£)å®šä¹‰ä¸€å¥—æ ‡å‡†çš„å‡½æ•°æŒ‡é’ˆç»“æ�„体V-Table。Concrete Strategy (具体ç–ç•¥)å®�ç�°å…·ä½“的算法。
代ç �å®�战 (The Code)C è¯è¨€å®�ç�°å¤šæ€�的秘密æ¦å™¨ç»“æ�„体 函数指针。
1 定义æ�¥å�£ (The Interface)这是所有算法必须é�µå®ˆçš„契约。// IValidator.h#include stdint.h#include stdbool.h// å‰�置声æ˜�类似 C çš„ this 指针typedef struct Validator_t Validator;// ç–ç•¥æ�¥å�£å®šä¹‰ (虚函数表)typedef struct {// åˆ�始化算法void (*init)(Validator* self);// 执行计算uint32_t (*calculate)(Validator* self, const uint8_t* data, uint32_t len);// 销æ¯�/清ç�† (å�¯é€‰)void (*deinit)(Validator* self);} ValidatorOps;// 基类结æ�„体struct Validator_t {const ValidatorOps* ops; // 指å�‘虚表的指针// å�¯ä»¥æ·»åР公共å±�性如超时时间ç‰uint32_t timeout;};
2 具体ç–ç•¥å®�ç�° (Concrete Strategies)我们把æ¯�个算法写在独立的.c文件里互ä¸�干扰。ç–ç•¥ A简å�•æ ¡éªŒ (Simple)// Validator_Simple.c#include IValidator.hstatic uint32_t simple_cal(Validator* self, const uint8_t* data, uint32_t len) {uint32_t sum 0;for(int i0; ilen; i) sum data[i];return sum; // 简å�•çš„ç´¯åŠ å’Œ}// 定义具体的虚表static const ValidatorOps s_simple_ops {.init NULL, // ä¸�需è¦�åˆ�始化.calculate simple_cal,};// æ�„é€ å‡½æ•°void Validator_Simple_Init(Validator* v) {v-ops s_simple_ops; // æ ¸å¿ƒç»‘å®šæŒ‡é’ˆ}ç–ç•¥ BCRC32 æ ¡éªŒ (CRC
// Validator_CRC
c#include IValidator.h#include stm32_crc.h // �赖硬件库static void crc_init(Validator* self) {__HAL_RCC_CRC_CLK_ENABLE(); // 开�硬件时钟}static uint32_t crc_cal(Validator* self, const uint8_t* data, uint32_t len) {return HAL_CRC_Calculate(hcrc, (uint32_t*)data, len);}static const ValidatorOps s_crc32_ops {.init crc_init,.calculate crc_cal,};void Validator_CRC32_Init(Validator* v) {v-ops s_crc32_ops;}
3 业务调用 (Context)// main.c#include IValidator.h// å…¨å±€çš„æ ¡éªŒå™¨å®�例Validator g_current_validator;// æ ¹æ�®é…�置选择ç–ç•¥ (Factory 模å¼�çš„é›�å½¢)void System_Init() {uint8_t config Read_Flash_Config();if (config MODE_HIGH_END) {Validator_CRC32_Init(g_current_validator);} else {Validator_Simple_Init(g_current_validator);}// åˆ�始化选定的算法if (g_current_validator.ops-init) {g_current_validator.ops-init(g_current_validator);}}// 业务逻辑完全ä¸�需è¦�知é�“底层是 CRC 还是 Sumbool Verify_Packet(uint8_t* data, int len, uint32_t expected) {// 多æ€�调用uint32_t result g_current_validator.ops-calculate(g_current_validator, data, len);return (result expected);}
内å˜ä¸�性能分æ�� (The Cost)空间开销Flash: è¿™ç§�写法对 Linker é��常å�‹å¥½ã€‚如æ�œä½ 在System_Init里没有调用Validator_CRC32_Initè�ªæ˜�的链æ�¥å™¨å¼€å�¯--gc-sections会自动把Validator_CRC
c的代ç �完全剔除。这就å®�ç�°äº†**“用多少链多少â€�**。RAM: æ¯�个ç–ç•¥å®�例å�ªéœ€è¦�一个指针大å°�4 å—节。虚表ValidatorOps声æ˜�为constå˜æ”¾åœ¨ Flash ä¸ä¸�å� RAM。时间开销间æ�¥è°ƒç”¨:ops-calculate(...)是一次间æ�¥å‡½æ•°è°ƒç”¨ (Indirect Call)。汇编视角:ç›´æ�¥è°ƒç”¨BL 0x08001234(跳转到固定地å�€)é—´æ�¥è°ƒç”¨LDR R0, [R1]; BLX R0(先读地å�€å†�跳转)性能æ�Ÿè€—: 相比直æ�¥è°ƒç”¨å¤šäº†
个指令周期。æ�¶æ�„师建议:ä¸�è¦�在百万次的æ��速循ç�¯å†…部使用ç–略模å¼�例如åƒ�ç´ çº§æ¸²æŸ“ã€‚ä½†å¯¹äº�é€šä¿¡åŒ…æ ¡éªŒã€�按键处ç�†ã€�ä¼ æ„Ÿå™¨è¯»å�–è¿™ç§�毫秒级任务性能æ�Ÿè€—å�¯ä»¥å¿½ç•¥ä¸�计æ�¢æ�¥çš„æ˜¯å·¨å¤§çš„æ�¶æ�„ç�µæ´»æ€§ã€‚
���延伸 (The Evolution)
1 è¿�行时动æ€�切æ�¢ (Hot Swap)è¿™å°±æ˜¯æ ‡é¢˜ä¸â€œçƒæ�’æ‹”â€�的由æ�¥ã€‚ æ¯”å¦‚ä¸€ä¸ªæ— çº¿æ�¥æ”¶æ¨¡å�—ä¿¡å�·å¥½æ—¶ç”¨Strategy_Fast(æ— æ ¡éªŒé€Ÿåº¦å¿«)ä¿¡å�·å·®æ—¶è‡ªåŠ¨åˆ‡æ�¢ä¸ºStrategy_Reliable(é«˜å¼ºåº¦æ ¡éªŒ)。 ä½ å�ªéœ€è¦�执行v-ops s_reliable_ops;业务层代ç �æ— éœ€ä»»ä½•å�˜åŠ¨ã€‚
2 ä¾�赖注入ä¸�打桩 (Mocking for Test)这是ç–略模å¼�在å�•元测试ä¸çš„æ�€æ‰‹çº§åº”用。 在 PC 上跑å�•å…ƒæµ‹è¯•æ—¶æ— æ³•è°ƒç”¨HAL_CRC_Calculateå› ä¸ºæ²¡æœ‰ç¡¬ä»¶ã€‚ ä½ å�¯ä»¥å†™ä¸€ä¸ªValidator_Mock.c在里é�¢ä¼ªé€ æ•°æ�®ã€‚// Test_Main.cvoid Test_Logic() {Validator v;Validator_Mock_Init(v); // 注入å�‡å¯¹è±¡// æµ‹è¯•ä¸šåŠ¡é€»è¾‘æ¤æ—¶ calculate 调用的是å�‡çš„æ¡©å‡½æ•°Verify_Packet(..., ...);}
17在线观看免费高清电视剧在线观看-17在线观看免费高清电视剧在线观看应用