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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 . I1 U2 Y  _& k1 n# ]. o
( X) w9 A7 N1 ~
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>0 q+ B- g$ W6 L; S- m2 }
#include <unistd.h>
# L( R* h! i% `1 z" {#include <sys/mman.h>
" B5 A. A2 D9 d#include <sys/types.h>2 g2 n3 {6 c1 {& e; g* T- W
#include <fcntl.h>' m8 `; x0 c7 z( |5 I

+ i' L5 ~1 j$ @! q) v#define SHAER_RAM_BASE_ADDR    (0x80000000)   " G. m$ X; k0 k% a  ^" B, D9 P
5 f& r6 z$ k9 v! d, R" ?; l
typedef struct" Z5 {# E/ Y+ |( w
{
* z' T* y- i3 w% |, @        unsigned int a;
; n7 P% K; y9 x1 e: |' s        unsigned int b;
& E" Z& g# x% R5 _# G2 Y& ?8 m        unsigned int packet_cout;; S7 l& W6 u7 B6 e, U% n/ s
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 o5 g3 K0 I/ R1 s0 o3 ?6 i
9 k) W& z/ x7 z9 Xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
9 V8 q0 ?" }. ?( y4 V( R7 e4 Vunsigned int count_copy = 0;
- i3 u1 G8 z6 Y4 o9 p: v" M1 s, a+ ]. s4 u+ ~5 w

8 Q) x) B& m6 y) z9 v  ]4 }7 Iint main()
+ m0 _* b$ c: ?3 R: o! I{
& w$ f1 h" P" _6 m) k. f- R        pRX_MSG_PROTOCOL pshreRAM = NULL;0 ~. a5 P) x2 |0 w0 U! L4 o
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;0 S7 `" `1 ]; p! j! F

9 w: K) @4 y5 c( N6 X* V        while(1)9 h5 {; J/ `1 _) S7 M+ y0 R
        {! K# ?3 W5 X1 N7 b. |1 \
                read_MSG_buffer(pshreRAM);6 ?. Q' f$ R* V3 j& @/ z3 J
        }               
' K  t/ l- h! ]: l) u" u}. i' q8 |0 n9 T" N9 f7 h

& b6 V2 N" G$ [" A- Pvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)/ a  ~6 Y0 `3 T7 k
{+ w1 p8 q& G( F% P
        RX_MSG_PROTOCOL buf;* K# \0 o! N/ S" l' A' E
        / P" {* J1 i, {
        buf.a = pshreRAM->a;9 b$ U# e4 P& \
        buf.b = pshreRAM->b;
/ I, i- M% I& ^# J& [: v        buf.packet_cout = pshreRAM->packet_cout;% S. y! |% x* }+ j* J+ }& o
        * {9 M9 f. ?4 Y9 z% q& n- j4 \' ?
        if(buf.packet_cout != count_copy)
1 E, r( R  c3 N/ x3 d' V7 }        {( }4 ?! N8 T  V! M; @
                printf("a is %d\n", buf.a);7 l7 z* i/ ?5 f1 `
                printf("b is %d\n", buf.b);
0 d1 f- a) O8 p0 {( M! w2 o7 d                printf("count is %d\n", buf.packet_cout);) ~, ?5 v1 g8 y2 f4 ?% k2 f
                count_copy = buf.packet_cout;
0 \- U) {9 ]& j- K% o# r        }
/ }! ?- d8 V: h# d. ^8 o        else
* f4 H% e6 v3 j  c% U1 y. H+ L        {/ x9 J0 B6 T, d6 Q
                printf("No effective message!");
9 G( S0 x- g9 u5 t# ?9 F; p        }
% J/ _% }% x8 J: b2 j5 x) t1 ?}. r; a0 I/ m- y/ E8 t5 X

% r8 M8 t- b% C/ |, D" ^: E) q. X: k* `! t" i) O( f" c  v
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。- K2 R( R( [! D3 |" S
使用下面代码,对内存使用了mmap函数后:
6 ~# Y+ N! N( }9 o- [#include <stdio.h>
+ z8 \# T  [% X& g#include <unistd.h>
  v0 k9 |6 X7 i) @0 P#include <sys/mman.h>
6 m( z& Q. X6 y#include <sys/types.h>' m" C8 q" v. |6 X% Q9 [/ d
#include <fcntl.h>" c3 b) R! f. j- N8 n
# U' Y; p+ ]& ^
#define SHAER_RAM_BASE_ADDR    (0x80000000)' a5 W3 x& |: j6 K7 v5 _
#define SHAER_RAM_SIZE         (0x20000)   
" a  w  w7 u* Z
3 K" F* W' ~, y9 b# c: ]typedef struct
6 y8 k  R' M6 y0 x( E# g{
: A! Y, [' Y1 q0 Q8 L: c        unsigned int a;$ b( Q1 ?  {" x, A9 J
        unsigned int b;
9 Z+ N8 n* p  E2 Y% i( A        unsigned int packet_cout;$ m4 K* {: J; [2 N$ P
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;4 G) |( `8 W! M; @" D
7 [1 k; _2 I# D3 a0 I
void read_MSG_buffer(int *baseaddr);9 q7 ?( x# E3 @# F
unsigned int count_copy = 0;
/ z. n2 \8 ?' W+ r0 a2 a2 _* N6 P4 ^* r2 o" Y5 N
int main()( |- [  R0 O+ Q6 v
{; Q- }. [* [3 X1 \
        int fd;
4 B! S4 v/ _7 H  f: H+ [( u+ R        int *mem = NULL;( u) f9 z# E6 \2 i$ k
# o' x4 K) n( \
        if((fd = open("/dev/mem", O_RDWR)) <0)
8 s8 T7 P1 I) X# ~5 T( g        {! G9 w& Q  e1 v. v% K
                perror("open error");5 E) X; h: a' J6 c6 L6 c4 F9 {" T
                return -1;( o- u; E, a! B
        }: g) h& D- a9 a+ w. h
        
. `* e" b8 r5 y: J& u" c7 m% s  n. V        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);2 H; a: T  v, `+ e7 Q# p& S& V

$ R( p, f  Q/ y% \        while(1)
6 J3 c9 [$ H  x2 o0 B, t        {
7 ^) H1 L1 B# Y4 }! F$ _6 W& i                read_MSG_buffer(mem);2 a: N7 J; r1 b) ]. N* b
        }               
5 D5 ^, y/ s7 {/ a$ R6 ]}: }8 ^% l! w( w$ v. I4 |

9 e* I' R0 O2 V& c" l4 T* d0 Xvoid read_MSG_buffer(int *baseaddr)
% p6 o1 k9 L! e3 X{% g4 c/ f+ p% z
        pRX_MSG_PROTOCOL pshreRAM = NULL;( B# F3 ?, w$ j2 h- l
  @3 P7 z% w6 p# I0 x/ E4 S
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;  Y! `8 z5 ?! ~
( O# D1 W2 [: c; F2 r3 z8 X, d+ w
        if(pshreRAM->packet_cout != count_copy)
6 F- v  S9 r* E- |        {
, A# b1 ]4 e) A9 O% Z                printf("a is %d\n", pshreRAM->a);
# n# F9 g4 U" @1 @- \$ w+ J) o                printf("b is %d\n", pshreRAM->b);  V  `/ z6 u- V' e
                printf("count is %d\n", pshreRAM->packet_cout);5 O4 b0 N  x, V  y% g+ f
                count_copy = pshreRAM->packet_cout;: T3 v- v# r4 ?) C4 x2 n+ b; M
        }
- f* T5 L' ?3 w2 ^        else; R: O: t) f" f/ c/ K& ]2 S/ P
        {  s2 B; F6 q5 }% w+ \
                printf("No effective message!\n");
# r8 d( w/ f2 V        }3 X# R# L: t2 ~0 F
}3 t) S1 R* L4 b! M* ^% e9 y  j& X8 f1 B
5 d9 `: q; I- x/ P; W
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???; e0 o9 t) c; G% f$ V

) q4 N/ p1 o, B
4 o6 q- ?0 i" x  t) K# Y+ C  n  d. C; M6 S

3 j' o; [, C0 h9 j  t2 K# z: }$ f
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-4 11:23 , Processed in 0.041980 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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