pw-embedded-c-style
npx skills add https://github.com/plugins-world/pw-skills --skill pw-embedded-c-style
Agent 安装分布
Skill 文档
pw-embedded-c-style
åµå ¥å¼ C 代ç 飿 ¼å©æ, åºäºãææææä½ å¦51åçæºã302 个 .c æä»¶å 66 个 .h æä»¶ç代ç 飿 ¼åæã
é»è®¤å½å飿 ¼: èå½¢å½å (snake_case)
使ç¨åºæ¯
éç¨æ åµ
- å建æ°çåµå ¥å¼ C é¡¹ç® (51 åçæºãSTM32 ç)
- ä¼åç°æåµå ¥å¼ä»£ç çå½ååç»æ
- çæç¡¬ä»¶é©±å¨æ¨¡å (宿¶å¨ã串å£ãLCDãæé®ç)
- è§èåé¡¹ç®æä»¶ç»ç»å代ç 飿 ¼
- å¦ä¹ åµå ¥å¼ C ç¼ç¨çæä½³å®è·µ
ä¸éç¨æ åµ
- éåµå ¥å¼çéç¨ C/C++ 项ç®
- éè¦ RTOS æå¤ææ¶æç项ç®
- çº¯ç®æ³å®ç° (æ 硬件交äº)
ä½¿ç¨æ¹å¼
é»è®¤å½å飿 ¼: èå½¢å½å (snake_case)
å¦é使ç¨é©¼å³°å½åï¼è¯·å¨æä»¤ä¸æç¡®è¯´æ “使ç¨é©¼å³°å½å”ã
å建项ç®
# åºç¡ç¤ºä¾ (é»è®¤èå½¢å½å)
/pw-embedded-c-style å建ä¸ä¸ª LED éªçç项ç®
# 带å¤è®¾ç项ç®
/pw-embedded-c-style å建ä¸ä¸ªå¸¦ LCD1602 æ¾ç¤ºåæé®è¾å
¥ç项ç®
# æå®è¯ç
/pw-embedded-c-style 为 STM32F103 å建ä¸ä¸ªä¸²å£é信项ç®
# æç¡®æå®ä½¿ç¨é©¼å³°å½å
/pw-embedded-c-style 使ç¨é©¼å³°å½åå建ä¸ä¸ªå®æ¶å¨é¡¹ç®
ä¼å代ç
# ä¼å代ç 飿 ¼ (é»è®¤èå½¢å½å)
/pw-embedded-c-style 帮æä¼åè¿æ®µæé®æ«æä»£ç
# éææ¨¡å
/pw-embedded-c-style å°è¿æ®µä»£ç éæä¸ºç¬ç«ç驱卿¨¡å
# æ·»å æ³¨é
/pw-embedded-c-style ä¸ºè¿æ®µå®æ¶å¨é
ç½®ä»£ç æ·»å è§è注é
# 使ç¨é©¼å³°å½åä¼å
/pw-embedded-c-style 使ç¨é©¼å³°å½åä¼åè¿æ®µä»£ç
çæé©±å¨æ¨¡æ¿
# çæç¹å®å¤è®¾é©±å¨
/pw-embedded-c-style çæ DS1302 宿¶æ¶é驱卿¨¡æ¿
# çæéä¿¡åè®®
/pw-embedded-c-style çæä¸²å£éä¿¡çæ¶åç¼å²åºå®ç°
æ ¸å¿è§è
å½åè§è
é»è®¤é£æ ¼: èå½¢å½å (snake_case)
// 彿°: èå½¢å½å
void config_timer0(unsigned int ms);
void lcd_write_cmd(unsigned char cmd);
void init_ds1302(void);
// åé: èå½¢å½å
unsigned char flag_500ms = 0;
unsigned char cnt_rxd = 0;
// å®/常é: å
¨å¤§åä¸å线
#define SYS_MCLK (11059200/12)
#define LCD1602_RS P1^0
// sbit: å
¨å¤§åæèå½¢
sbit LED = P0^0;
sbit EN_LED = P1^4;
å¤é飿 ¼: 驼峰å½å (camelCase/PascalCase)
ç¨æ·æç¡®è¦æ±æ¶ä½¿ç¨æ¤é£æ ¼:
// 彿°: 大驼峰
void ConfigTimer0(unsigned int ms);
void LcdWriteCmd(unsigned char cmd);
void InitDS1302(void);
// åé: å°é©¼å³°
unsigned char flag500ms = 0;
unsigned char cntRxd = 0;
// å®/常é: å
¨å¤§åä¸å线 (ç¸å)
#define SYS_MCLK (11059200/12)
#define LCD1602_RS P1^0
// sbit: å
¨å¤§åæå¤§é©¼å³°
sbit LED = P0^0;
sbit ENLED = P1^4;
代ç ç»ç»
åæä»¶é¡¹ç®
#include <reg52.h>
// å®å®ä¹
// sbit å®ä¹
// å
¨å±åé
// 彿°å£°æ
void main() { }
// 彿°å®ç°
// 䏿彿°
夿件项ç®
config.h - å
¨å±é
ç½® (ç±»åå®ä¹ãç³»ç»åæ°ãIO å®ä¹)
module.h - 模å头æä»¶ (ç»æä½ãextern 声æã彿°å£°æ)
module.c - 模åå®ç° (#define _MODULE_C)
main.c - 主ç¨åº
å¸¸ç¨æ¨¡å¼
宿¶å¨é ç½®
void config_timer0(unsigned int ms)
{
unsigned long tmp;
tmp = 11059200 / 12;
tmp = (tmp * ms) / 1000;
tmp = 65536 - tmp;
tmp = tmp + 12;
T0RH = (unsigned char)(tmp>>8);
T0RL = (unsigned char)tmp;
TMOD &= 0xF0;
TMOD |= 0x01;
TH0 = T0RH;
TL0 = T0RL;
ET0 = 1;
TR0 = 1;
}
䏿æå¡å½æ°
void interrupt_timer0() interrupt 1
{
static unsigned char tmr_500ms = 0;
TH0 = T0RH;
TL0 = T0RL;
if (++tmr_500ms >= 50)
{
tmr_500ms = 0;
flag_500ms = 1;
}
}
æ å¿ä½é©±å¨
bit flag_500ms = 0;
// 䏿ä¸è®¾ç½®
flag_500ms = 1;
// ä¸»å¾ªç¯æ£æµ
while (1)
{
if (flag_500ms)
{
flag_500ms = 0;
// æ§è¡ä»»å¡
}
}
æé®æ¶æ
void key_scan(void)
{
static unsigned char keybuf[4] = {0xFF, 0xFF, 0xFF, 0xFF};
keybuf[i] = (keybuf[i] << 1) | KEY_IN[i];
if ((keybuf[i] & 0x0F) == 0x00)
key_sta[i] = 0; // ç¨³å®æä¸
}
æ¥è¡¨æ³
unsigned char code led_char[] = {
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};
P0 = led_char[num];
注é飿 ¼
/* æä»¶å¤´æ³¨é */
/*
*******************************************************************************
* æä»¶åç§°: main.c
* æ è¿°: åè½æè¿°
* çæ¬å·: v1.0.0
*******************************************************************************
*/
/* 彿°æ³¨é */
void lcd_show_str(unsigned char x, unsigned char y,
unsigned char *str, unsigned char len)
// è¡å
注é
EA = 1; // ä½¿è½æ»ä¸æ
config_timer0(10); // é
ç½® T0 宿¶ 10ms
代ç 飿 ¼ç¹ç¹
- ç®æ´ç´æ¥, é¿å è¿åº¦æ½è±¡
- ç´æ¥æä½ç¡¬ä»¶å¯åå¨
- ä½¿ç¨ sbit å®ä¹ IO å£
- 䏿åéå·ç´æ¥æå® (interrupt 1)
- åå¨åºå修饰符 (code, pdata)
- æ å¿ä½é©±å¨ä¸»å¾ªç¯
- æ¥è¡¨æ³å¤çæ°æ®æ å°
æä½³å®è·µ
å½å飿 ¼éæ©
é»è®¤ä½¿ç¨èå½¢å½å (snake_case):
- 符å Linux å æ ¸å大夿°å¼æºåµå ¥å¼é¡¹ç®ç飿 ¼
- åè¯åéææ¾, å¯è¯»æ§å¥½
- éåç产项ç®åå¢éåä½
使ç¨é©¼å³°å½å (camelCase/PascalCase) çåºæ¯:
- æå¦é¡¹ç®æåèææä½¿ç¨é©¼å³°å½å
- å¢éæç¡®è¦æ±ä½¿ç¨é©¼å³°å½å
- éè¦ä¸ç°æé©¼å³°å½å代ç ä¿æä¸è´
éè¦åå: æ´ä¸ªé¡¹ç®å¿ é¡»ç»ä¸å½å飿 ¼
项ç®å建建议
- åæä»¶é¡¹ç®: éç¨äºç®ååè½ (LED éªçãæé®æ£æµç)
- 夿件项ç®: éç¨äºå¤å¤è®¾åå (LCD + æé® + 串å£ç)
- 模åå驱å¨: æ¯ä¸ªå¤è®¾ç¬ç«ä¸º .h/.c æä»¶å¯¹
代ç ä¼å建议
- å½åè§è: é»è®¤ä½¿ç¨èå½¢å½å (彿°/åé), å®ç¨å ¨å¤§åä¸å线
- ä¸æç²¾ç®: 䏿彿°åªè®¾ç½®æ å¿ä½, 主循ç¯å¤çä¸å¡é»è¾
- 硬件æ½è±¡: 使ç¨å®å®ä¹é离硬件ç¸å ³ä»£ç , 便äºç§»æ¤
- æ³¨éæ¸ æ°: å ³é®å¯åå¨é ç½®å¿ é¡»æ·»å è¡å 注é
常è§é误å¤ç
é®é¢ 1: 宿¶å¨ä¸åç¡®
// é误: æªèèæä»¤å¨æè¡¥å¿
tmp = 65536 - tmp;
// æ£ç¡®: å ä¸è¡¥å¿å¼
tmp = 65536 - tmp;
tmp = tmp + 12; // è¡¥å¿ä¸æååºå»¶è¿
é®é¢ 2: æé®æå¨
// é误: ç´æ¥è¯»åæé®ç¶æ
if (KEY == 0) { /* å¤ç */ }
// æ£ç¡®: 使ç¨ç§»ä½å¯å卿¶æ
keybuf = (keybuf << 1) | KEY;
if ((keybuf & 0x0F) == 0x00) { /* ç¨³å®æä¸ */ }
é®é¢ 3: å ¨å±åéå²çª
// é误: å¤ä¸ªæ¨¡å使ç¨ç¸ååéå
unsigned char flag; // å¨å¤ä¸ª .c æä»¶ä¸å®ä¹
// æ£ç¡®: ä½¿ç¨æ¨¡ååç¼æ static
static unsigned char uart_flag; // ä»
æ¬æä»¶å¯è§
extern unsigned char g_system_flag; // å
¨å±å
񄧮
注æäºé¡¹
- 䏿彿°å¿ 须尽快è¿å, é¿å é¿æ¶é´å ç¨
- å ¨å±åéå¨ä¸æå主循ç¯å ±äº«æ¶, ä½¿ç¨ volatile 修饰
- 大æ°ç»ä½¿ç¨ code 修饰符åå¨å¨ ROM ä¸, èç RAM
- å»¶æ¶å½æ°ä¸è¦å¨ä¸æä¸è°ç¨
- 夿件项ç®å¿ é¡»ä½¿ç¨ extern æ£ç¡®å£°æå ¨å±åé
ææ¯åæ°è¯´æ
æ¯æçè¯çå¹³å°
- 51 ç³»å: AT89C51, STC89C52, STC15 ç
- STM32 ç³»å: F103, F407 ç (éè°æ´å¯åå¨å®ä¹)
- å ¶ä» 8051 å ¼å®¹è¯ç
代ç è§èæ¥æº
åºäºãææææä½ å¦51åçæºãå®é æå¦é¡¹ç®:
- 302 个 .c æºæä»¶
- 66 个 .h 头æä»¶
- æ¶µç 20+ ç§å¸¸ç¨å¤è®¾é©±å¨
- é»è®¤éç¨èå½¢å½å, æ´ç¬¦ååµå ¥å¼ C 项ç®è§è
è¾åºæ ¼å¼
- åæä»¶é¡¹ç®: çæ main.c
- 夿件项ç®: çæ config.h, module.h, module.c, main.c
- 驱卿¨¡å: çæ driver.h, driver.c
示ä¾åºæ¯
åºæ¯ 1: å¿«éååéªè¯
ç¨æ·éæ±: “å建ä¸ä¸ª LED æ¯ç§éªççç¨åº”
婿è¾åº:
- å个 main.c æä»¶
- å å«å®æ¶å¨é ç½®å䏿彿°
- ä½¿ç¨æ å¿ä½é©±å¨ LED 翻转
åºæ¯ 2: 模åå项ç®
ç¨æ·éæ±: “å建ä¸ä¸ªå¸¦ LCD1602 æ¾ç¤ºæ¸©åº¦åæé®è°èç项箔
婿è¾åº:
- config.h (ç³»ç»é ç½®)
- lcd1602.h/c (LCD 驱å¨)
- key.h/c (æé®é©±å¨)
- ds18b20.h/c (æ¸©åº¦ä¼ æå¨é©±å¨)
- main.c (主ç¨åº)
åºæ¯ 3: 代ç ä¼å
ç¨æ·éæ±: “ä¼åè¿æ®µä¸²å£æ¥æ¶ä»£ç ”
婿æä½:
- æ£æ¥å½åè§è
- ä¼åç¼å²åºç®¡ç
- æ·»å æº¢åºä¿æ¤
- è¡¥å æ³¨é说æ
åºäºå®é æå¦é¡¹ç®æ»ç», 注éå®ç¨æ§åå¯è¯»æ§ãé»è®¤ä½¿ç¨èå½¢å½å飿 ¼, 符ååµå ¥å¼ C 项ç®è§èã