ChatGPT がコードを書くとしたら、彼は何を書きますか

今日、ふとやってみたくなったのですが、ChatGPTで51個のコードを書いたらどうなるでしょうか?今日は、彼が 51 コードをどのように書くかを見ていきます。ロボットによって書かれたコードは実行できますか?

始める前に、ChatGPTに自己紹介をさせてください!

Q:  ChatGPT 自己紹介!

A: もちろん、自己紹介をしたいと思います! OpenAIが開発した人工知能技術に基づく自然言語処理モデルChatGPTです。私のフルネームは「Conversational Generative Pre-trained Transformer」、略して「GPT」で、最新バージョンは GPT-3 です。

ディープ ラーニング技術を使用して大量の自然言語テキスト データをトレーニングし、入力された質問やタスクに従って、文法的および意味規則に準拠した自然言語の回答またはテキストを生成できます。技術や歴史から文化や芸術まで、日常生活から仕事や勉強まで、あらゆる種類の質問に答えることができます。さらに、I は、自然言語処理、インテリジェント カスタマー サービス、機械翻訳、テキスト要約、感情分析など、さまざまな応用分野でも使用できます。

要するに、私は人々に豊富な知識とインテリジェントなサービスを提供できる強力な人工知能言語モデルです。

2. 彼に照明プログラムを書いてもらう

質問:  C 言語で 51 MCU の照明プログラムを作成するのを手伝ってください!

答え: もちろん、以下は、LED ライトを 500 ミリ秒ごとに点滅させる単純な 51 個のシングルチップ照明プログラムです。

#include <reg52.h>

sbit LED = P1^0; // 定义P1.0口为LED灯的控制引脚

void main() {
    while(1) { // 循环执行
        LED = 0; // 将P1.0口输出0,LED亮起来
        delay(500); // 延时500毫秒
        LED = 1; // 将P1.0口输出1,LED熄灭
        delay(500); // 延时500毫秒
    }
}

// 延时函数,延时时间以毫秒为单位
void delay(unsigned int time) {
    unsigned int i,j;
    for(i=0;i<time;i++)
        for(j=0;j<125;j++);
}

このプログラムは、P1.0ポートを LED ライトの制御ピンとして定義し、ループを使用して LED ライトの状態を連続的に切り替え、LED ライトが 500 ミリ秒ごとに点滅するようにします。同時に、遅延関数がプログラムで定義され、各状態の期間が制御されます。

このプログラムを 51 シングルチップ マイクロコンピュータにダウンロードして実行すると、LED ライトが 500 ミリ秒ごとに点滅することがわかります。LEDライトの点滅頻度を変更したい場合は、delay()機能で遅延時間を調整できます。

上記の分析から、ChatGPT によって書かれたコードには実際にコメントが付けられていることがわかります。 .

では、彼に難しいシリアル ポート プログラムを書くように依頼したらどうなるでしょうか。一緒に聞いてみましょう!

3.シリアルポートコードを書く

質問:  51 シングルチップ マイコンのシリアル ポート プログラムを C 言語で書いてください。

回答: 以下は、シリアルポートを介してコンピュータにデータを送信し、コンピュータから送信されたデータを受信して​​シングルチップ マイクロコンピュータの P2 ポートに出力する、51 個のシングルチップ シリアル ポートの簡単なプログラム例です。学習と実験のためにこのプログラムを参照できます。

#include <reg52.h>  // 引入51单片机头文件
#include <intrins.h>

#define FOSC 11059200UL // 系统晶振频率,单位为Hz
#define BAUD 9600       // 串口波特率

unsigned char ReceiveData; // 串口接收到的数据

/* 初始化串口 */
void InitSerial() {
    TMOD |= 0x20; // 设置为自动重装定时器1工作模式
    TH1 = TL1 = 256 - FOSC / 12 / 32 / BAUD; // 计算波特率重载值
    PCON &= 0x7F; // 波特率不加倍
    SCON = 0x50;  // 串口模式1,REN=1,允许串口接收
    TR1 = 1;      // 启动定时器1
    EA = ES = 1;  // 开启总中断和串口中断
}

/* 串口发送数据 */
void SendByte(unsigned char dat) {
    SBUF = dat;          // 将数据写入串口发送缓存
    while(!TI);          // 等待发送完成
    TI = 0;              // 清除发送完成标志
}

/* 串口接收中断处理函数 */
void ReceiveInterrupt() interrupt 4 {
    if(RI) {            // 判断是否接收到数据
        ReceiveData = SBUF; // 读取串口接收缓存中的数据
        RI = 0;         // 清除接收中断标志
        P2 = ReceiveData; // 输出接收到的数据
    }
}

void main() {
    InitSerial(); // 初始化串口
    while(1) {
        SendByte('H');   // 发送字符'H'
        SendByte('i');   // 发送字符'i'
        SendByte(0x0d);  // 发送回车符
        SendByte(0x0a);  // 发送换行符
        DelayMs(1000);   // 延时1秒
    }
}

このプログラムの機能は、「H\r\n」文字をシリアルポートから毎秒送信すると同時に、コンピュータから送信されたデータをシリアルポートから受信し、マイクロコントローラの P2 ポートに出力することです。このプログラムは単なる例であることに注意する必要があります。より複雑な操作を実行する場合は、必要に応じて変更する必要があります。

彼が書いたコードは 1 文字を送信する関数だけをカプセル化していることがわかりましたが、文字列を送信できる関数をカプセル化できますか?

もちろんできます。簡単な例を次に示します。

void send_string(char *str) {
    while (*str) {
        SBUF = *str++;
        while (TI == 0);
        TI = 0;
    }
}

この関数のパラメーターは文字列ポインターであり、シリアル ポートを使用してこの文字列の各文字を送信します。各文字が送信されると、関数はシリアル ポートが送信を完了するのを待ち、次の文字の送信を続行して、各文字が正しく送信されることを確認します。

全体として、彼が書いたコードは依然として非常に優れていますが、試してみたところ、上記のコードはコンパイルして実行できます。

次の難易度のアップグレードは、Linux ドライバーの作成を手伝って試してみてください!

4. GPIO Linux ドライバーを作成する

質問:  Linux 環境で GPIO を制御するためのドライバーとアプリケーション プログラムの作成を手伝ってもらえますか?

答え: もちろんできます。以下は、Linux 環境で使用できる基本的な GPIO ドライバーとアプリケーションです。

1 つ目は、Linux カーネルによって提供される GPIO サブシステムを使用する GPIO ドライバーのコードです。

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/gpio.h>
#include <linux/interrupt.h>
#include <linux/delay.h>

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");

#define GPIO_LED 17
#define GPIO_BUTTON 27

static irqreturn_t button_isr(int irq, void *data) {
    printk(KERN_INFO "Button pressed!\n");
    gpio_set_value(GPIO_LED, 1);
    mdelay(500);
    gpio_set_value(GPIO_LED, 0);
    return IRQ_HANDLED;
}

static int __init gpio_init(void) {
    int ret = 0;
    if (!gpio_is_valid(GPIO_LED) || !gpio_is_valid(GPIO_BUTTON)) {
        printk(KERN_INFO "Invalid GPIO!\n");
        return -ENODEV;
    }
    gpio_request(GPIO_LED, "led");
    gpio_direction_output(GPIO_LED, 0);
    gpio_request(GPIO_BUTTON, "button");
    gpio_direction_input(GPIO_BUTTON);
    ret = gpio_request_one(GPIO_BUTTON, GPIOF_IN, "button");
    if (ret < 0) {
        printk(KERN_INFO "Failed to request GPIO button\n");
        return ret;
    }
    ret = request_irq(gpio_to_irq(GPIO_BUTTON), button_isr, IRQF_TRIGGER_FALLING, "button_irq", NULL);
    if (ret < 0) {
        printk(KERN_INFO "Failed to request IRQ for GPIO button\n");
        return ret;
    }
    printk(KERN_INFO "GPIO module loaded\n");
    return 0;
}

static void __exit gpio_exit(void) {
    gpio_set_value(GPIO_LED, 0);
    free_irq(gpio_to_irq(GPIO_BUTTON), NULL);
    gpio_free(GPIO_LED);
    gpio_free(GPIO_BUTTON);
    printk(KERN_INFO "GPIO module unloaded\n");
}

module_init(gpio_init);
module_exit(gpio_exit);

GPIO_BUTTONこのドライバーは、ピンが立ち下がりエッジをトリガーしたときに実行されるGPIO 割り込みハンドラーを登録します。割り込みハンドラが呼び出されると、メッセージが出力され、GPIO_LEDシンプルな点滅効果のためにピンが制御されます。

以下は、コマンド ライン パラメーターを介して GPIO の状態を制御できる単純な GPIO アプリケーションです。

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>

#define GPIO_LED 17

void usage() {
    printf("Usage: gpio <on|off>\n");
}

int main(int argc, char *argv[]) {
    int fd;
    if (argc < 2) {
        usage();
        return 1;
    }
    fd = open("/sys/class/gpio/export", O_WRONLY);
    if (fd < 0) {
        perror("Failed to export GPIO");
        return 1;
    }
    write(fd, "17", 2);
    close(fd);
    fd = open("/sys/class/gpio/gpio17/direction", O_WRONLY);
    if (fd < 0) {
        perror("Failed to set GPIO direction");
        return 1;
    }
    write(fd, "out", 3);
    close(fd);
    fd = open("/sys/class/gpio/gpio17/value", O_WRONLY);
    if (fd < 0) {
        perror("Failed to

以下は、上記のプログラムに対する ChatGPT の分析です。

このコードを Linux システムで実行すると、アプリケーションは対応するデバイス ドライバーを呼び出します。これにより、GPIO の操作が初期化されます。つまり、GPIO の入出力モードの設定、ピンの方向の設定など、GPIO の構成が初期化されます。 、設定レベルなど アプリケーションが GPIO を制御する必要がある場合、GPIO 出力をオンにする、GPIO 出力をオフにするなどの対応する命令をドライバーに送信します。命令を受信した後、ドライバーは対応する操作を実行して GPIO の状態を制御します。

具体的には、ヘッダファイルの参照、デバイスのオープン、ioctl関数の呼び出し、デバイスのクローズが含まれます。ヘッダー ファイルの参照には、ドライバーが使用する必要のある定数と関数を定義するマクロ定義と関数宣言が含まれています。デバイスのオープンは open システム コールによって実現され、呼び出しが成功した後にファイル ディスクリプタが返されます。ioctl 関数はコマンドをドライバに送信するために使用されます. この関数の最初のパラメータはファイル記述子であり, 2 番目のパラメータはコマンドであり, 3 番目のパラメータはオプションのデータ構造です. この関数の戻り値は実行。デバイスのクローズは close システム コールによって実現され、クローズが成功した後にファイル ディスクリプタが解放されます。

全体として、コードは Linux 環境で GPIO を制御する基本的な機能を実装し、GPIO ドライバー開発のテンプレートとして使用できます。

感情を体験する

一般的に、ChatGPT は非常に優れたユーザー エクスペリエンスを備えていると思います. 特別なスキルや知識を使用せずに問題をすばやく簡単に解決する方法をユーザーに提供できますが、回答の一部はまだ擬人化されておらず、一部の回答は書きすぎです.しかし、これも理解できます。結局のところ、彼はまだロボットです!

しかし、彼は他のソフトウェアと比較して非常に有能であると言わざるを得ません。基本的に、彼はあなたが尋ねた質問に答えることができます. 最後に、人工知能が人間に取って代わるかどうか、誰もが最も関心を持っている質問を彼に尋ねました!

おすすめ

転載: blog.csdn.net/volval/article/details/130506187