OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5915|回复: 0
打印 上一主题 下一主题

OMAPL138的内存映射是否在Linux下已经完成???

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 # g/ V# T" T7 O& a" K; t& o: a
6 F6 F( W# u& v. M  \- g
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
2 q- C- X5 @% ]6 G/ Z. m8 `; _#include <unistd.h>6 D. w) Y8 n) H+ p4 X4 ~( d
#include <sys/mman.h>8 \, J- m7 t9 I6 A8 t8 v- y
#include <sys/types.h>- e" P) Z/ Y7 Z3 O0 U
#include <fcntl.h>
- V9 ~1 x5 w- c! H$ |- W) S
9 Z6 I2 F" L$ r4 m$ V" O#define SHAER_RAM_BASE_ADDR    (0x80000000)   # R( \! B2 U% y5 s( _  K
: M+ m# W* A4 @9 K! N: ~
typedef struct
! \4 _2 v) Q0 B: D1 P4 @{  ~0 J- U; c' x+ f# n3 n0 K
        unsigned int a;. P9 }9 U- O; p  C4 M
        unsigned int b;
2 x- ?3 l; U2 t* O        unsigned int packet_cout;( p& v# _+ R8 }# G3 l- T- i
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;6 v7 v6 Q: x# S& O8 e1 A% x+ @

) L0 ?: [5 c" @+ p. q) wvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);& M! F- v# i" [4 h* C* m& V
unsigned int count_copy = 0;
# T3 K  Z0 a- C1 j7 w( h1 q2 I' O3 n

: P% ~8 Y: _6 \3 E: Z2 {int main()& R2 J) u7 X. l2 |
{1 C' ?& y6 ?; X7 D8 ?& L. q
        pRX_MSG_PROTOCOL pshreRAM = NULL;
7 i2 k, o6 K/ C' J        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;* ~" Y7 j* J2 R1 H( r3 n3 J: H
' J# ]7 K+ e- D* k5 G* X4 l
        while(1)! Y& _* e3 W7 ]6 t8 p
        {& @2 t* c; _; V8 r  b& K/ m
                read_MSG_buffer(pshreRAM);. Z. F+ S2 p# |' u$ B$ h: [9 y
        }                # ]0 ?) y1 @; N1 t7 _# C
}
5 C( e: s' L6 F5 `  [8 J$ U$ S2 ~3 m
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)) r. {# M: m+ S( s) y! K( h
{! {, f. t6 A% H; t' X, D* h6 E
        RX_MSG_PROTOCOL buf;
' g2 b6 B: _. I  \6 H        ' ?2 X4 @; V* f% B" P3 N
        buf.a = pshreRAM->a;! _! g0 ^, {+ E4 a9 g. o
        buf.b = pshreRAM->b;% X1 ~; p3 V$ `& }$ Y/ X
        buf.packet_cout = pshreRAM->packet_cout;
$ r' x- a$ e) f" H( ~- y+ `8 o        
9 y+ J, d9 I, T+ z1 d/ a        if(buf.packet_cout != count_copy)8 P, k) [( t- r: t3 U3 f. F
        {0 V: A* I3 b* w, ?/ X% C. y( [' [
                printf("a is %d\n", buf.a);% Z  a4 M3 q2 t- f' e
                printf("b is %d\n", buf.b);
6 Z, w% I7 [- E' o4 K                printf("count is %d\n", buf.packet_cout);
. I* ^2 q0 V  B/ [0 F' m                count_copy = buf.packet_cout;# r0 j9 d0 A) p# ]  T3 A. ]
        }
+ z) W" e. L* ?" \  `! u  S- e        else
6 W1 \) P$ D( ~2 o. q: L4 {1 ~        {4 Z. R6 s' x9 z8 C% ^
                printf("No effective message!");
: c. e! O( W. q, B/ B; Z3 U/ Z        }# [! C& c; q4 u$ \+ B
}8 ]  n2 i2 }, E3 {
) o) b* S. a* y' C
* `: `* R; {5 p6 l1 f% ]# ]) K
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。# [5 G- `% w$ f7 N! Z4 p, z
使用下面代码,对内存使用了mmap函数后:
( K  t! b, c: I& W  M#include <stdio.h>5 \7 {& f" q& \
#include <unistd.h>
4 E8 r! Q; c! p) k1 @% _#include <sys/mman.h>
7 O$ @% Z" S+ S0 f#include <sys/types.h>5 R0 b. z2 c  e% R$ j  X
#include <fcntl.h>0 F  Y" ~4 l: B3 c
, C0 a' O8 }  E
#define SHAER_RAM_BASE_ADDR    (0x80000000)
! V1 o/ J( G" g#define SHAER_RAM_SIZE         (0x20000)   
- h# o7 r7 f' Z6 n0 |
. f/ o$ w. H/ ztypedef struct( ]/ [/ _+ @6 M/ V5 d
{) s5 I/ V8 Z8 `3 `
        unsigned int a;
! W/ E& c. R, ]: P1 T* b. J# {8 }: N        unsigned int b;
7 m" @/ L7 [) n6 L2 X9 L        unsigned int packet_cout;. _+ A* |2 ]: ~  T! o* C6 O
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;  K2 t) k4 w6 J8 H

! v8 ]- ]+ P7 \) X0 }9 zvoid read_MSG_buffer(int *baseaddr);
$ ^, Y& P% v. [4 O0 kunsigned int count_copy = 0;
# s+ ?8 H% a# H1 _5 |8 B
$ r8 x4 i; a( Aint main(), Z3 z1 v. m& `2 y3 t
{2 T3 K+ F( s9 i- \
        int fd;3 Z, J( |' u0 }, V! B+ V
        int *mem = NULL;
4 B3 w% A' c) q) n& L1 L2 E
/ H6 u% r, Y- _, f0 L        if((fd = open("/dev/mem", O_RDWR)) <0)
/ }0 z$ K% i* x: V        {# o  O: R: Z7 s# \0 E/ W, K
                perror("open error");
% ?& B. x) i) H- h9 r, j! G                return -1;
! k8 n; Z1 C+ m- L/ M        }) l" J, `. ]; o+ P: n
        ' z% X: H% I) i+ D2 v; p; }/ o
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
8 W* J* \5 C: s& @1 U6 H- _  x4 Q1 M+ J9 L9 Z* s& a$ M" e' }( u
        while(1)
2 [* I8 T- I& p! r2 @4 y        {4 f% W% D& o1 n8 ^4 m. i6 w/ }
                read_MSG_buffer(mem);) E/ z: X( ^, J3 M6 K7 @/ u
        }               
$ l2 U4 ]. D  v/ G}
& s" p) g2 G1 J0 e. k
& [: Q" q& U( V* B! `void read_MSG_buffer(int *baseaddr)
" f: n9 e2 x! W{5 c3 o! \; s7 |7 g% E" {
        pRX_MSG_PROTOCOL pshreRAM = NULL;5 l. s7 K+ D$ ?& E; v& w4 D/ w
4 ~1 j: h. `9 k% T, t
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
; Z& s, u& C4 l) r
* R) q1 z# g: d" G( m        if(pshreRAM->packet_cout != count_copy)0 m3 X8 Y' |9 i' j* g# g
        {' s4 j* |3 I3 i- v1 o! \
                printf("a is %d\n", pshreRAM->a);, i1 F7 x3 J) t/ v- _3 n
                printf("b is %d\n", pshreRAM->b);
; _' Y$ k5 f; Y2 S& @1 N                printf("count is %d\n", pshreRAM->packet_cout);
6 t0 u9 ?5 j2 j                count_copy = pshreRAM->packet_cout;: H+ n" A$ G- W4 l
        }
! _5 K  n& H) T. `# A        else
- t% \3 j  ]8 b9 s1 N        {
) \8 [7 S9 Z  V6 V                printf("No effective message!\n");
% S$ X6 o& o3 c8 O1 B. p1 e        }
4 U8 o( P5 [8 R6 @8 l5 E}
2 z, d; _0 |' @/ b. I9 J3 V# a
+ S7 g( U; @+ E" k, m没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
" T+ w8 c2 }- e$ e
/ Y8 o& [3 h1 B6 b5 U( @7 p( X
+ y( C* s, r$ N$ B  n; ~) |! h/ q! M; Q/ h% n
, B- x5 ^: |( D7 E- _
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

点击跳转“创龙科技服务通”

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2026-3-13 13:32 , Processed in 0.040990 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表