คำถามติดแท็ก c

C เป็นภาษาที่ใช้งานระบบ (ขั้นตอน) ที่จำเป็น มันถูกออกแบบมาให้คอมไพล์โดยใช้คอมไพเลอร์ที่ค่อนข้างตรงไปตรงมาเพื่อให้เข้าถึงหน่วยความจำระดับต่ำเพื่อสร้างภาษาที่แมปได้อย่างมีประสิทธิภาพกับคำสั่งของเครื่องจักรและต้องการการสนับสนุนเวลาทำงานน้อยที่สุด C จึงมีประโยชน์สำหรับแอปพลิเคชั่นมากมายที่เคยเขียนโค้ดในภาษาแอสเซมบลี จาก http://en.wikipedia.org/wiki/C_(programming_language)

8
เหตุใด printf () ไม่ดีสำหรับการดีบักระบบฝังตัว
printf()ผมคิดว่ามันเป็นสิ่งที่ดีที่จะพยายามที่จะแก้ปัญหาโครงการไมโครคอนโทรลเลอร์โดยใช้ ฉันสามารถเข้าใจได้ว่าคุณไม่มีสถานที่ที่กำหนดไว้ล่วงหน้าและสามารถใช้หมุดที่มีค่าได้ ในเวลาเดียวกันฉันเห็นคนใช้พิน UART TX สำหรับส่งออกไปยังเทอร์มินัล IDE ด้วยDEBUG_PRINT()มาโครแบบกำหนดเอง
16 c  debugging 

3
จาก C ถึง Assembly
สมมติว่าเรามีโค้ด C ต่อไปนี้สำหรับ avr-8bit: int v1=1; int v2=2; v2=v2+v1; ฉันคาดว่าถอดแยกชิ้นส่วนต่อไปนี้ ldi r18, 1; ldi r19, 2; add r19, r18; แต่หลังจากที่ฉันวิ่ง: avr-gcc -mmcu=atmega2560 Test.c -o Test.elf และ avr-objdump -S Test.elf > Test.lss ฉันได้ถอดแยกชิ้นส่วนต่อไปนี้ ldi r24, 0x01 ; 1 ldi r25, 0x00 ; 0 std Y+2, r25 ; 0x02 std Y+1, r24 …
16 avr  c  assembly 

1
การสร้างสัญญาณไซน์โดยใช้ PWM
เราไม่สามารถสร้างสัญญาณไซน์อย่างถูกต้องโดยใช้ไมโครคอนโทรลเลอร์MC68HC908GP32 คำอธิบาย PWM เริ่มต้นในหน้า 349 ความถี่สัญญาณนาฬิกา 2.4MHz ในขณะที่เราใช้ PWM 7 kHz โดยใช้ prescaler และตั้งค่าโมดูโลตัวจับเวลาเป็น 350 ดังนี้: T1SC = 0x60; // Prescaler: Div entre 64 //Counter modulo = 0x015E = 350 T1MODH = 0x01; // High T1MODL = 0x5E; // Low เอาต์พุต PWM เป็นตัวกรองโดยตัวกรอง RLC ต่อไปนี้จากนั้น DC จะถูกลบออกโดยใช้ซีรีส์ 1uF cap ความถี่คัตออฟอยู่ต่ำกว่า …
16 microcontroller  c  pwm 

2
STM32F2: Makefile สคริปต์ตัวเชื่อมโยงและการรวมไฟล์เริ่มต้นโดยไม่มี IDE เชิงพาณิชย์
ฉันทำงานกับ STM32F2 (โดยเฉพาะคือ STM32F217IGH6 ในคณะกรรมการพัฒนา) เป็นเวลาประมาณสองเดือน ปัญหาที่ใหญ่ที่สุดของฉันเกี่ยวกับ "การตั้งค่า" ซึ่งรวมถึง makefile, linker script และไฟล์เริ่มต้น โดยเฉพาะอย่างยิ่งฉันไม่สามารถตั้งค่าตารางเวกเตอร์ขัดจังหวะและเรียกตัวจัดการขัดจังหวะได้อย่างถูกต้อง ST ให้ตัวอย่างที่ปรับให้เหมาะกับ IDE เชิงพาณิชย์ แต่ฉันใช้การรวบรวมใหม่ Yagarto ของ toolchain GCC (และ OpenOCD เพื่อโหลดภาพผ่าน JTAG) มีตัวอย่างโครงการสำหรับบอร์ดของฉัน (หรือลูกพี่ลูกน้องที่ใกล้ชิด) ซึ่งมี makefile, linker script และการรวมไฟล์เริ่มต้นสำหรับ IDE ที่ไม่ใช่เชิงพาณิชย์ที่ถูกตั้งค่าสำหรับตัวจัดการอินเตอร์รัปต์
16 c  stm32  gcc 

4
วิธีการนำส่วนที่สำคัญไปใช้กับ ARM Cortex A9
ฉันกำลังย้ายรหัสดั้งเดิมจากแกน ARM926 ไปยัง CortexA9 รหัสนี้เป็น baremetal และไม่รวมระบบปฏิบัติการหรือไลบรารีมาตรฐานที่กำหนดเองทั้งหมด ฉันมีความล้มเหลวที่ดูเหมือนจะเกี่ยวข้องกับสภาพการแข่งขันที่ควรได้รับการป้องกันโดยการแบ่งส่วนที่สำคัญของรหัส ฉันต้องการความคิดเห็นเกี่ยวกับวิธีการของฉันเพื่อดูว่าส่วนที่สำคัญของฉันอาจใช้ไม่ได้กับ CPU นี้หรือไม่ ฉันใช้ GCC ฉันสงสัยว่ามีข้อผิดพลาดเล็กน้อย นอกจากนี้มีไลบรารี opensource ที่มี primitives ประเภทนี้สำหรับ ARM (หรือแม้แต่ไลบราล็อก / เซมาฟอร์ไลบรารี่ที่มีน้ำหนักเบา) หรือไม่? #define ARM_INT_KEY_TYPE unsigned int #define ARM_INT_LOCK(key_) \ asm volatile(\ "mrs %[key], cpsr\n\t"\ "orr r1, %[key], #0xC0\n\t"\ "msr cpsr_c, r1\n\t" : [key]"=r"(key_) :: "r1", "cc" ); #define …
15 c  embedded  interrupts 

3
โปรโมชั่น C Integer บน MCU 8 บิต
การใช้ avr-gcc เป็นตัวอย่างจะระบุชนิด int ให้มีความกว้าง 16 บิต การดำเนินการกับตัวถูกดำเนินการ 8 บิตใน C ส่งผลให้ตัวถูกดำเนินการถูกแปลงเป็นชนิด int 16 บิตเนื่องจากการส่งเสริมจำนวนเต็มใน C นี่หมายความว่าการดำเนินการทางคณิตศาสตร์ 8 บิตทั้งหมดบน AVR จะใช้เวลานานกว่านี้หากเขียนใน C มากกว่า ถ้าเขียนในการชุมนุมเนื่องจากการส่งเสริมจำนวนเต็มของ C?
14 microcontroller  avr  c 

9
วิธีที่ดีที่สุดในการเขียนฟังก์ชั่นสำหรับซอฟต์แวร์ฝังตัวเพื่อให้ได้ประสิทธิภาพที่ดีขึ้นคืออะไร [ปิด]
ปิด คำถามนี้เป็นคำถามความคิดเห็นตาม ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบข้อเท็จจริงและการอ้างอิงได้โดยแก้ไขโพสต์นี้ ปิดให้บริการใน2 ปีที่ผ่านมา ฉันเคยเห็นห้องสมุดสำหรับไมโครคอนโทรลเลอร์และฟังก์ชั่นของพวกเขาทำสิ่งหนึ่งครั้ง ตัวอย่างเช่นสิ่งนี้: void setCLK() { // Code to set the clock } void setConfig() { // Code to set the config } void setSomethingElse() { // 1 line code to write something to a register. } จากนั้นมาฟังก์ชั่นอื่น ๆ ที่อยู่ด้านบนของมันที่ใช้รหัส 1 บรรทัดนี้ที่มีฟังก์ชั่นเพื่อตอบสนองวัตถุประสงค์อื่น ๆ ตัวอย่างเช่น: …

6
หลีกเลี่ยงตัวแปรโกลบอลเมื่อใช้อินเตอร์รัปต์ในระบบฝังตัว
มีวิธีที่ดีในการใช้การสื่อสารระหว่าง ISR และส่วนที่เหลือของโปรแกรมสำหรับระบบฝังตัวที่หลีกเลี่ยงตัวแปรทั่วโลกหรือไม่? ดูเหมือนว่ารูปแบบทั่วไปคือการมีตัวแปรทั่วโลกซึ่งใช้ร่วมกันระหว่าง ISR และส่วนที่เหลือของโปรแกรมและใช้เป็นธง แต่การใช้ตัวแปรทั่วโลกนี้ขัดแย้งกับธัญพืชให้ฉัน ฉันได้รวมตัวอย่างง่ายๆโดยใช้ ISR สไตล์ avr-libc: volatile uint8_t flag; int main() { ... if (flag == 1) { ... } ... } ISR(...) { ... flag = 1; ... } ฉันไม่สามารถเห็นสิ่งที่เป็นปัญหาในการกำหนดขอบเขต ตัวแปรใดที่สามารถเข้าถึงได้โดยทั้ง ISR และส่วนที่เหลือของโปรแกรมจะต้องเป็นสากลโดยแท้จริง? แม้จะมีสิ่งนี้ฉันก็มักจะเห็นคนพูดถึงสิ่งต่าง ๆ ตามแนว "ตัวแปรทั่วโลกเป็นวิธีหนึ่งในการนำการสื่อสารระหว่าง ISRs และส่วนที่เหลือของโปรแกรม" (เน้นที่เหมือง) ซึ่งดูเหมือนจะบ่งบอกว่ามีวิธีอื่น ๆ ถ้ามีวิธีอื่นพวกมันคืออะไร?

3
การประกาศตัวแปรด้วย @ ใน C
ฉันกำลังอ่านโค้ด C และพบคำประกาศนี้ในโปรแกรม: unsigned char serv_ctr @0x0002; ใครสามารถชี้ให้ฉันดูเอกสารประกอบหรืออธิบายว่า"@ 0x0002"สำหรับอะไรในคอมไพเลอร์ Mplab XC8 v1.35 C
11 c  embedded  mplabx  xc8  variable 

4
ปัญหา Endian บน STM32
ฉันกำลังใช้ arm gcc (CooCox) เพื่อเขียนโปรแกรม STM32F4 การค้นพบและฉันได้รับการต่อสู้กับปัญหา endian ฉันสุ่มตัวอย่างด้วย ADC 24 บิตผ่าน SPI เนื่องจากสามไบต์กำลังเข้ามา MSB ครั้งแรกที่ฉันมีความคิดในการโหลดมันลงในกลุ่มเพื่อให้พวกเขา (ฉันหวังว่าต่อไป!) ใช้งานง่ายขึ้นเล็กน้อย typedef union { int32_t spilong; uint8_t spibytes [4]; uint16_t spihalfwords [2];} spidata; spidata analogin0; ฉันโหลดข้อมูลโดยใช้ spi อ่านเป็น analogin0.spibytes [0] - [2], ด้วย [0] ในฐานะ MSB จากนั้นฉันพ่นมันออกทาง USART ที่ megabaud ครั้งละ 8 บิต …
11 c  stm32  cortex-m  gcc 

2
โปรแกรม AVR EEPROM โดยตรงจากแหล่ง C
เมื่อคุณรวมรหัสต่อไปนี้ในแหล่ง AVR C คุณสามารถตั้งโปรแกรมฟิวส์ได้โดยตรงโดยไม่ต้องใช้คำสั่งพิเศษหรือไฟล์. hex: #include <avr/io.h> FUSES = { .low = LFUSE_DEFAULT , .high = HFUSE_DEFAULT , .extended = EFUSE_DEFAULT , }; มีกลอุบายที่คล้ายกันกับค่าของโปรแกรมใน EEPROM หรือไม่ ฉันตรวจสอบแล้ว/usr/lib/avr/include/avr/fuse.hว่าฉันสามารถค้นหาความคิดเห็นเกี่ยวกับมาโครได้ที่ไหน แต่ฉันไม่พบความคิดเห็นที่คล้ายกัน/usr/lib/avr/include/avr/eeprom.hและการตีความสิ่งที่ตัวประมวลผลล่วงหน้ามีอยู่ในลีกของฉัน มันจะมีประโยชน์จริง ๆ ถ้าฉันสามารถรวมค่า EEPROM เริ่มต้นในซอร์สโค้ด C ใครรู้วิธีการทำเช่นนั้น? Edit1: เคล็ดลับ FUSES นี้ดำเนินการเฉพาะในเวลา ISP ไม่ใช่เวลา RUN ดังนั้นจึงไม่มีฟิวส์ที่ถูกตั้งโปรแกรมในรหัสแอสเซมบลีที่เป็นผลลัพธ์ในคอนโทรลเลอร์ แต่โปรแกรมเมอร์จะวนไปตามวงจรการเขียนโปรแกรม FUSES พิเศษโดยอัตโนมัติ edit2: ฉันใช้เครื่องมือ avr-gcc และ …
11 avr  c  attiny  eeprom 

3
สภาพการแข่งขัน Sleep Microcontroller
รับไมโครคอนโทรลเลอร์ที่ใช้รหัสต่อไปนี้: volatile bool has_flag = false; void interrupt(void) //called when an interrupt is received { clear_interrupt_flag(); //clear interrupt flag has_flag = true; //signal that we have an interrupt to process } int main() { while(1) { if(has_flag) //if we had an interrupt { has_flag = false; //clear the interrupt flag …

6
อะไรเป็นสาเหตุที่ทำให้เคอร์เนล RTOS มัลติทาสกิ้ง PIC16 ของฉันไม่ทำงาน?
ฉันพยายามที่จะสร้าง RTOS กึ่งร่วมมือ (pre-emptive) สำหรับไมโครคอนโทรลเลอร์ PIC x16 ในคำถามก่อนหน้านี้ฉันได้เรียนรู้ว่าการเข้าถึงตัวชี้สแต็กของฮาร์ดแวร์ไม่สามารถทำได้ในแกนประมวลผลเหล่านี้ ฉันดูที่หน้านี้ใน PIClist และนี่คือสิ่งที่ฉันพยายามนำไปใช้โดยใช้ C คอมไพเลอร์ของฉันคือ Microchip XC8 และขณะนี้ฉันกำลังทำงานกับ PIC16F616 ด้วย RC oscillator ภายใน 4MHz ที่เลือกในบิตกำหนดค่า ฉันได้เรียนรู้ว่าฉันสามารถเข้าถึงการลงทะเบียน PCLATH และ PCL ด้วย C โดยดูที่ไฟล์ส่วนหัวของคอมไพเลอร์ของฉัน ดังนั้นฉันจึงพยายามที่จะใช้งานสลับง่าย ทำงานตามที่ต้องการในตัวดีบักถ้าฉันหยุดการดีบักหลังจากรีสตาร์ทรีเซ็ตและตั้งค่าพีซีที่เคอร์เซอร์เมื่อเคอร์เซอร์ไม่อยู่ในบรรทัดแรก ( TRISA=0;) แต่อยู่บนอีกบรรทัดหนึ่ง (เช่นANSEL=0;) ในการเริ่มต้นดีบั๊กฉันได้รับข้อความเหล่านี้ในDebugger Console: Launching Programming target User program running No source code lines were found …

1
PIC18F4550 C-compiler ที่เป็นโอเพ่นซอร์ส & ข้ามแพลตฟอร์ม?
ฉันเป็นผู้ใช้ AVR เป็นเวลานาน ฉันชอบ AVR-GCC ที่ทำงานบนสองระบบปฏิบัติการหลักที่ฉันใช้ (Mac OS X และ Linux) เป็นโอเพ่นซอร์สและได้รับการสนับสนุนจาก Atmel ฉันต้องการกลับไปสู่การเขียนโปรแกรม PIC (ใช้ใน 90s) เนื่องจากมี PIC ที่ดีงามอยู่ที่นั่นเช่น PIC18F4550-class ของชิป น่าเสียดายที่คอมไพเลอร์ส่วนใหญ่สำหรับ PIC18 ทั้งหมดดูเหมือนจะเป็น Windows เท่านั้นและจ่ายเงิน และพวกเขามักจะมี IDE ที่ฉันไม่ต้องการ ฉันชอบคอมไพเลอร์บรรทัดคำสั่งและ Makefiles ดังนั้นฉันจึงสามารถบอกได้ด้วยการดูไฟล์เดียวว่าโค้ดได้รับการสร้างอย่างไร (และไม่ลุยผ่านเขาวงกตที่คดเคี้ยวของกล่องโต้ตอบ) ฉันแหย่ที่SDCCแต่ดูเหมือนว่าจะไม่ได้รับการสนับสนุน PIC18F4550 และแม้ว่ามันจะทำอย่างไรการบ่นบนเน็ตทำให้ฟังดูเหมือนการสนับสนุน PIC18 นั้นอ่อนแอหรือสับสนมากที่สุดในการใช้ ดังนั้นคอมไพเลอร์บรรทัดคำสั่งข้ามแพลตฟอร์มที่ดีที่มี PIC18F4550 รองรับนั้นคืออะไร? ความล้มเหลวนั้นคืออะไร C-compiler ที่ดีที่สุดสำหรับ PIC18F4550 และหนึ่งจะใช้กับ Makefiles ได้อย่างไร?
11 pic  c  compiler 

1
อัตราการฆ่า I2C คืออะไร
ฉันกำหนดค่า I 2 C บน PIC18 โดยใช้ฟังก์ชั่นในตัวของคอมไพเลอร์ C18 ดังที่อธิบายไว้ในส่วนที่ 2.4 ของเอกสาร : void OpenI2C2( unsigned char sync_mode, unsigned char slew ); slewผมไม่แน่ใจว่าสิ่งที่ฉันควรจะทำอย่างไรกับ ฉันสามารถเลือกจากสองตัวเลือกที่กำหนดไว้ในi2c.h: SLEW_OFF: อัตราการฆ่าไม่ทำงานสำหรับโหมด 100 kHz SLEW_ON: เปิดใช้งานอัตรา Slew สำหรับโหมด 400 kHz ในแผ่นข้อมูลในการลงทะเบียน 15-1 หน้า 257 ทั้งสองตัวเลือกมีการอธิบายรายละเอียดเพิ่มเติมเล็กน้อย: 1 = การควบคุมอัตราการเลื่อนไม่ทำงานสำหรับโหมดความเร็วมาตรฐาน (100 kHz และ 1 MHz) 0 = เปิดใช้งานการควบคุมอัตราสโลว์สำหรับโหมดความเร็วสูง (400 …
10 pic  c  i2c  software  c18 

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.