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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
2 _7 ?! B' |/ c, b, }* @
. {+ s9 A% {4 N1 W8 iOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>$ \8 k& U( }  @6 \% y# E
#include <unistd.h>
- D' s) P+ ~% E# T# k+ u4 l3 ?#include <sys/mman.h>
" j; E% C% U, N5 Q, Q5 o8 j#include <sys/types.h>/ O9 q( L  Y9 T8 W% m/ O) O
#include <fcntl.h>0 m# j1 d- E0 K5 R7 Z0 s4 |9 N

, b/ e: ?1 b  b5 f7 u: @. x#define SHAER_RAM_BASE_ADDR    (0x80000000)   / V6 O2 X9 n2 `% M# X) y# R
: g* t5 j2 _9 c  U
typedef struct
- i- t5 Z& P% A. B; E{9 w" R% h; `# \! C
        unsigned int a;
3 w8 o% h# b& n1 `4 c5 [* x        unsigned int b;
& W* |! H" W* I) G. y1 e4 Z        unsigned int packet_cout;
1 |2 R' a+ d$ Z9 l' |' t* F}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;; O0 S5 h; S. q# `) \9 q- [

" t: O' _" A" @2 d5 i; Kvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
, l' H' B) x7 t+ Gunsigned int count_copy = 0;& D- ~, o0 M) M/ a) g9 ^
% A: a& L4 s1 D. C) i
$ t' y+ g+ Z8 ~1 C& O
int main()
: A, |- p/ J5 k: n; f{0 j, t- I2 X6 S3 z. w$ E
        pRX_MSG_PROTOCOL pshreRAM = NULL;
, g/ d( ]& N9 {/ |5 Y, i, A        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
' R) m$ q+ A" }4 e& X) f' m6 n0 p7 [% p/ V6 R
        while(1)5 `+ }, |: `! j  ^3 f
        {# h4 B: K4 S7 n0 C. K
                read_MSG_buffer(pshreRAM);
# k% b: [7 f& D8 X9 }+ |2 F3 q        }                ; X" p3 k* o0 H* ]2 b0 |
}! a( w, |$ b# I* e# B/ [

# z& |0 |: _* J& mvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM), q, W. b+ Z/ U6 _* N0 T4 y/ o8 K
{
) n; N) O4 i' U2 k        RX_MSG_PROTOCOL buf;
- o* d/ H6 F, P6 ^* [6 i        
8 Y# Z5 J% T. c/ ]! [+ D+ u        buf.a = pshreRAM->a;
% B% @* m8 H" Y6 m1 s  s        buf.b = pshreRAM->b;
! j6 {$ u/ ]) D+ k$ _1 |6 a6 l        buf.packet_cout = pshreRAM->packet_cout;: x9 w3 h6 ^: i* Y- d/ c
        $ T- C- }5 ~$ T- D" Z$ a
        if(buf.packet_cout != count_copy)6 a/ {8 k3 t" q% s/ \! v, N6 ^
        {) {0 F1 B8 o2 K. I% G4 h
                printf("a is %d\n", buf.a);
1 W, d" W. k9 P" }( B                printf("b is %d\n", buf.b);
; Y/ q, u3 |# Y5 s                printf("count is %d\n", buf.packet_cout);: x% b6 O3 c1 v( {" F* ?" |
                count_copy = buf.packet_cout;  |' Z( p1 p5 F4 D* G, r0 m6 A
        }0 {/ P  U# o7 t+ ^0 {) k/ X# w
        else& D' ~: V# h$ i9 Z- s* j" g* k# X
        {5 K# l% c# B. A8 k
                printf("No effective message!");0 D5 P; L( N2 T" N
        }
: Y1 H* H: G% z8 @/ J" i}
3 q. ?6 w! q! E! T& m  A  ^# M: j  ]' G  r+ |8 J3 e

1 M8 l2 J# J# g" x但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。, o, W: u/ j9 n% d+ c" I0 g
使用下面代码,对内存使用了mmap函数后:0 F) X9 b8 s2 }: |
#include <stdio.h>
- [: ]( o( [' E7 ~- L5 N4 G+ L#include <unistd.h>' _" E+ K: W% s* i" }1 ?0 X2 G
#include <sys/mman.h>! }* ?3 Y3 K5 J0 \0 r$ L
#include <sys/types.h>/ X2 J- f1 b, t7 M" R, n
#include <fcntl.h>
- p/ I5 |. G' \% l+ P( p1 X* i! A' ^# E# w
#define SHAER_RAM_BASE_ADDR    (0x80000000)+ x$ g1 t/ y- M
#define SHAER_RAM_SIZE         (0x20000)   
) G# g0 y, ^. _* M/ G! m
" f) q  k0 Z7 K4 h" T+ S) Ntypedef struct
9 B, D7 ~3 j9 T6 c, v( C1 A{
6 K+ c0 P' C5 D" u) Q: u' b# L: X0 u        unsigned int a;
+ n6 h. @) \! P& B        unsigned int b;
1 p4 R) a9 m& G. u        unsigned int packet_cout;( \( c% }( u1 j$ W) M* L. J& `
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 G7 Y& r' M+ m% a$ _; {7 q3 f* P: j+ q; Q! F8 l- G' p. t( W$ B
void read_MSG_buffer(int *baseaddr);- M" Y1 F5 t) J
unsigned int count_copy = 0;
+ Z' I0 v2 [/ n8 P+ a- M' d! y
4 ^0 {0 L4 s$ x. D" cint main()4 O3 c$ X5 t- x# n$ U
{
- J# g; h$ R, B7 K; K; g: y  M% K        int fd;
7 [6 @+ m8 p- Q9 U2 @        int *mem = NULL;
* V6 _; N+ I, S7 f0 i# \* N; _) V# G
/ ?+ e& |6 H" Y8 W7 r        if((fd = open("/dev/mem", O_RDWR)) <0), |3 F) X! n% D" d" b  E
        {- |3 F8 q+ S4 C) F
                perror("open error");
9 Y' n7 d. J2 ?# E3 P! l                return -1;
4 @# G: z( q3 }! x& N- P0 @1 z+ e        }
: o( ~/ P- `8 ?4 G" K        6 F0 i. d7 ?/ @$ s2 Z7 o1 V9 W
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);/ B3 D# r& ^! E# r9 v7 c

5 [0 u1 K# H7 w9 j7 T$ O+ U: O        while(1)
' n! ~+ z6 C0 j        {
* H& B2 B. O/ ~- Y                read_MSG_buffer(mem);4 u; ^4 r2 W' L8 D9 u
        }                9 S+ R) E, b* z& D$ ]' b
}
  W( R1 z) G& \5 @* ^: e& i+ S! B/ O9 R7 m. J) @! k
void read_MSG_buffer(int *baseaddr)
; O: }5 U% f! e1 i6 I{
( _7 b( b, t( X2 F        pRX_MSG_PROTOCOL pshreRAM = NULL;
/ t( Y2 I/ C+ N7 @5 A
' ~5 a& k  t: Q8 z; P        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;* w# @' k3 T8 L

- \8 w3 ~( D7 |; x% h* t" z3 J        if(pshreRAM->packet_cout != count_copy)$ [" r7 Z. v* b" k% r! x( v( M" m4 e
        {
2 i. S" }' ]2 S3 V2 p: H                printf("a is %d\n", pshreRAM->a);
) R, W) Y7 Q% y8 l8 p  Y                printf("b is %d\n", pshreRAM->b);
. c5 Q% {. a+ J1 ~                printf("count is %d\n", pshreRAM->packet_cout);2 o8 o, J. }0 C
                count_copy = pshreRAM->packet_cout;5 o# Q4 y0 p4 y; w& K& T) y$ ]
        }) q+ H+ e- n3 J3 h  Z
        else
: T, u. c% R& I        {. o5 A9 f' T* M; m" ?/ Q/ @4 N  g
                printf("No effective message!\n");* F7 d3 G. @4 U3 Y
        }" q( w# o+ Z' ~, N" i
}% W0 L4 x- d0 C$ y! j/ d

/ f5 A1 n0 K+ r: r2 F没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???$ T: s+ M; n7 p) A0 z7 s/ _

* O. ^, s, n. y4 n0 S. t1 G# j( q6 {( N* M% n7 P1 W

* U( Q0 I, w5 x5 L) O: w5 z2 Q( E
. R0 A$ T8 @# v" a% Y. e3 f2 r
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-26 20:20 , Processed in 0.044067 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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