一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C語言驅(qū)動(dòng)實(shí)現(xiàn)

汽車電子技術(shù) ? 來源:程序猿搬磚 ? 作者:程序猿搬磚 ? 2023-03-02 16:28 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

ARM Coretex-A的不同模式

為了盡可能的保護(hù)計(jì)算機(jī)資源(CPU、內(nèi)存、IO等),不同的CPU架構(gòu)實(shí)現(xiàn)了不同的權(quán)限等級(jí),等級(jí)越高可訪問的系統(tǒng)資源越多(包括執(zhí)行一些特權(quán)指令),這是因?yàn)槠胀ㄓ脩艏?jí)別的程序代碼質(zhì)量不能得到完全的保障,為了更好的保護(hù)計(jì)算機(jī)資源會(huì)讓用戶級(jí)別的代碼工作在盡可能少的訪問系統(tǒng)資源的模式下,而像操作系統(tǒng)這樣經(jīng)過千錘百煉的程序質(zhì)量有保障,CPU可以放心的把計(jì)算機(jī)資源交出來讓操作系統(tǒng)可以隨意訪問。

在當(dāng)前的實(shí)驗(yàn)中,由于我們是工作在祼機(jī)狀態(tài)下的程序,可以簡單的認(rèn)為我們的代碼與操作系統(tǒng)代碼是一個(gè)級(jí)別的,就算代碼有問題那從CPU的角度來講我們的祼機(jī)代碼也是高質(zhì)量的,也就是說可以工作在高等級(jí)權(quán)限的模式下。

ARM Coretex-A系列處理器有以下幾種工作模式:圖片其中,SVC是超級(jí)管理員模式,可以訪問所有的計(jì)算機(jī)資源。

設(shè)置CPU工作模式為SVC

Coretex-A提供了一個(gè)專門的寄存器CPSR程序狀態(tài)寄存器來控制當(dāng)前CPU的工作模式, CPSR的每一位的邏輯如下:圖片

其中的低5位M[4:0]用于指定當(dāng)前CPU的工作模式,具體表格如下:

M[4:0] CPU工作模式
10000 User模式
10001 FIQ模式
10010 IRQ模式
10011 Supervisor(SVC)模式
10110 Monitor(MON)模式
10111 Abort(ABT)模式
11010 Hyp(HYP)模式
11011 Undef(UND)模式
11111 System(SYS)模式

通過表格可以看出,如果要設(shè)置成SVC模式,則需要將CPSR寄存器的低5位M[4:0]設(shè)置成10011

讀寫CRSR寄存的操作指令與讀取通用寄存器使用的ldrstr不要樣,需要使用mrs讀取CPSR的數(shù)據(jù),msrCPSR寫入數(shù)據(jù)。

/// 將cpsr寄存器中的數(shù)據(jù)讀取到r0
/// 這是因?yàn)閏psr是不能使用運(yùn)算符指令對(duì)其進(jìn)行直接的操作的,需要使用通用寄存器
mrs r0, cpsr
/// 通過使用bic指令將,r0的低5位都清空,這里使用了0x1f=11111. bic指令后面的操作數(shù)掩碼位的值是1表示將此位清空,否則保持不變
bic r0, r0, #0x1f
/// 通過orr(或)指令將r0寄存器中的低5位設(shè)置成10011
orr r0, r0, #0x13
/// 將r0的數(shù)據(jù)寫入cprs寄存器,完成svc模式切換
msr cprs, r0

設(shè)置C語言運(yùn)行環(huán)境

C語言要工作,需要指定一個(gè)??臻g,通過指定sp指針就可以給C語言開辟一塊棧空間。

Coretex-A的棧是向下生長的,也就是從高地址向低地址生成(即棧頂在高地址)。I.MX6ULLDDR的起始地址是0x80000000,這里設(shè)置一個(gè)2MB的空間大小,實(shí)際上也可以設(shè)置成1MB或者512KB也是完全夠用的。所以需要設(shè)置sp指針的初始位置是0x802000000.

/// 設(shè)置sp指針地址
ldr sp, =0x80200000
/// 跳轉(zhuǎn)到c語言的main函數(shù)開始執(zhí)行
b main

編寫C語言LED驅(qū)動(dòng)程序

  • 1.使能CCM_CCGR1
#define CCM_CCGR1 *((volatile unsigned int *)0x020C406C)
CCM_CCGR1 = 0xFFFFFFFF;
  • 2.復(fù)用SW_MUX_CTL_PAD_GPIO1_IO03為GPIO1_IO03
#define MUX_CTL_PAD_GPIO1_IO03 *((volatile unsigned int *)0x020E0068)
MUX_CTL_PAD_GPIO1_IO03 = 0x5; /// 10011
  • 3.配置SW_PAD_CTL_PAD_GPIO1_IO03電氣屬性
#define SW_PAD_CTL_PAD_GPIO1_IO03 *((volatile unsigned int *)0x020E02F4)
SW_PAD_CTL_PAD_GPIO1_IO03 = 0x10B0
#define GPIO01_GDIR *((volatile unsigned int *)0x0209C004)
GPIO01_GDIR = 0x08;
#define GPIO01_DR *((volatile unsigned int *)0x0209C000)
void delay_ms(volatile unsigned int n) {
    while (n--) { }
}
void delay(volatile unsigned int n) {
    while (n--) {
        delay_ms(0x7FF);
    }
}
whilte(1) {
  delay(500);
  GPIO01_DR = 0x0;
  delay(500);
  GPIO01_DR = 0x8;
}

編譯代碼

  • 編寫Makefile
/// 定義目標(biāo)文件變量
objs := start.o main.o

/// 生成ledc.bin,依賴objs
ledc.bin:${objs}
  arm-linux-gnueabihf-ld -Ttext 0x87800000 -o ledc.elf $^    /// 將目標(biāo)文件鏈接生成ledc.elf $^表示所有依賴文件的集合,使用空格分開,去重
  arm-linux-gnueabihf-objcopy -O binary -S ledc.elf $@       /// 將ledc.elf生成ledc.bin, $@指目標(biāo)集合,這里的目標(biāo)就是上面定義的ledc.bin
  arm-linux-gnueabihf-objdump -D -m arm ledc.elf > ledc.dis  /// 將ledc.elf反匯編成ledc.dis,主是要方便查看連接后的代碼段指令是否符合預(yù)期

/// 當(dāng)目標(biāo)文件沒有時(shí)會(huì)使用如下的模式規(guī)則去生成對(duì)應(yīng)的目標(biāo)文件
/// $@指要生成的.o文件, $<指生成.o的源文件,比如start.o:start.s, $@(start.o) $<(start.s)
%.o:%.s
  arm-linux-gnueabihf-gcc -Wall -nostdlib -c -o $@ $<
%.o:%.S
  arm-linux-gnueabihf-gcc -Wall -nostdlib -c -o $@ $< 
%.o:%.c
  arm-linux-gnueabihf-gcc -Wall -nostdlib -c -o $@ $< 

/// 定義清楚方法
clean:
  rm -rf *.o ledc.bin ledc.elf ledc.dis

編譯

make clean && make

編譯完成之后燒寫到SD卡,選擇SD卡啟動(dòng)觀察LED燈閃爍

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    11080

    瀏覽量

    217099
  • 計(jì)算機(jī)
    +關(guān)注

    關(guān)注

    19

    文章

    7663

    瀏覽量

    90809
  • 操作系統(tǒng)
    +關(guān)注

    關(guān)注

    37

    文章

    7152

    瀏覽量

    125592
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    C語言:標(biāo)準(zhǔn)和實(shí)現(xiàn)

    C 語言:標(biāo)準(zhǔn)與實(shí)現(xiàn) The Standards and Implementations of the C Programming Language前言
    發(fā)表于 11-27 22:27 ?58次下載

    CRC算法原理及C語言實(shí)現(xiàn)

    CRC算法原理及C語言實(shí)現(xiàn):本文從理論上推導(dǎo)出CRC 算法實(shí)現(xiàn)原理,給出三種分別適應(yīng)不同計(jì)算機(jī)或微控制器硬件環(huán)境的C 語言程序。讀者更能根據(jù)
    發(fā)表于 09-23 23:38 ?31次下載

    pid算法原理和C語言的簡單實(shí)現(xiàn)

    pid算法原理和C語言的簡單實(shí)現(xiàn),有興趣的可以看看
    發(fā)表于 12-07 18:34 ?9次下載

    C語言教程之不使用strcpy()函數(shù)實(shí)現(xiàn)

    C語言教程之不使用strcpy()函數(shù)實(shí)現(xiàn),很好的C語言資料,快來學(xué)習(xí)吧。
    發(fā)表于 04-25 15:03 ?0次下載

    C語言標(biāo)準(zhǔn)與實(shí)現(xiàn)

    C語言標(biāo)準(zhǔn)與實(shí)現(xiàn) HENBUCUO BJBUI
    發(fā)表于 06-08 18:18 ?0次下載

    C語言模擬實(shí)現(xiàn)strcat函數(shù)

    C語言模擬實(shí)現(xiàn)strcat函數(shù)
    的頭像 發(fā)表于 06-29 16:18 ?2649次閱讀

    C語言模擬實(shí)現(xiàn)strcmp函數(shù)

    C語言模擬實(shí)現(xiàn)strcmp函數(shù)
    的頭像 發(fā)表于 06-29 16:51 ?2908次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>模擬<b class='flag-5'>實(shí)現(xiàn)</b>strcmp函數(shù)

    CC2540驅(qū)動(dòng)C語言源代碼

    CC2540驅(qū)動(dòng)C語言源代碼
    發(fā)表于 03-10 11:13 ?5次下載
    CC2540<b class='flag-5'>驅(qū)動(dòng)</b>的<b class='flag-5'>C</b><b class='flag-5'>語言</b>源代碼

    使用單片機(jī)實(shí)現(xiàn)1602字符液晶工作于8位模式直接驅(qū)動(dòng)顯示的C語言程序

    本文檔的主要內(nèi)容詳細(xì)介紹的是使用單片機(jī)實(shí)現(xiàn)1602字符液晶工作于8位模式直接驅(qū)動(dòng)顯示的C語言程序。
    發(fā)表于 03-24 14:45 ?7次下載

    使用單片機(jī)實(shí)現(xiàn)ULN2803驅(qū)動(dòng)點(diǎn)陣屏仿電梯數(shù)字滾動(dòng)顯示的C語言實(shí)例

    本文檔的主要內(nèi)容詳細(xì)介紹的是使用單片機(jī)實(shí)現(xiàn)ULN2803驅(qū)動(dòng)點(diǎn)陣屏仿電梯數(shù)字滾動(dòng)顯示的C語言實(shí)例免費(fèi)下載。
    發(fā)表于 03-31 16:45 ?38次下載

    EE-188:在ADSP-219x DSP上用C語言實(shí)現(xiàn)中斷驅(qū)動(dòng)系統(tǒng)

    EE-188:在ADSP-219x DSP上用C語言實(shí)現(xiàn)中斷驅(qū)動(dòng)系統(tǒng)
    發(fā)表于 04-17 14:59 ?0次下載
    EE-188:在ADSP-219x DSP上用<b class='flag-5'>C</b><b class='flag-5'>語言實(shí)現(xiàn)</b>中斷<b class='flag-5'>驅(qū)動(dòng)</b>系統(tǒng)

    累加校驗(yàn)和C語言實(shí)現(xiàn)

    累加校驗(yàn)和C語言實(shí)現(xiàn)
    發(fā)表于 11-29 18:06 ?10次下載
    累加校驗(yàn)和<b class='flag-5'>C</b><b class='flag-5'>語言實(shí)現(xiàn)</b>

    怎么用C語言實(shí)現(xiàn)多態(tài)

    這里我想主要介紹下在C語言中是如何實(shí)現(xiàn)的面向?qū)ο蟆V懒?b class='flag-5'>C語言實(shí)現(xiàn)面向?qū)ο蟮姆绞?,我們?cè)俾?lián)想下,C
    的頭像 發(fā)表于 10-12 09:12 ?2313次閱讀

    C語言實(shí)現(xiàn)簡單工廠模式

    在我們的印象中,設(shè)計(jì)模式是由面向?qū)ο蟮?b class='flag-5'>語言(C++、JAVA)才能完成的,而 C 語言是面向過程的語言,不能
    發(fā)表于 06-05 11:28 ?715次閱讀
    用<b class='flag-5'>C</b><b class='flag-5'>語言實(shí)現(xiàn)</b>簡單工廠模式

    EE-188:使用C語言在ADSP-219x DSP上實(shí)現(xiàn)中斷驅(qū)動(dòng)系統(tǒng)

    電子發(fā)燒友網(wǎng)站提供《EE-188:使用C語言在ADSP-219x DSP上實(shí)現(xiàn)中斷驅(qū)動(dòng)系統(tǒng).pdf》資料免費(fèi)下載
    發(fā)表于 01-15 16:06 ?0次下載
    EE-188:使用<b class='flag-5'>C</b><b class='flag-5'>語言</b>在ADSP-219x DSP上<b class='flag-5'>實(shí)現(xiàn)</b>中斷<b class='flag-5'>驅(qū)動(dòng)</b>系統(tǒng)