OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 - q  c2 \- w# \: l. j% O
3 r5 ?: i4 y* c4 M
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
% R/ ?  i) U  g9 [#include <unistd.h>
; M, e9 g7 j( ?8 L- z' v2 g#include <sys/mman.h>8 J  B6 }: |1 a9 E. ~5 w
#include <sys/types.h>6 h: x! D, ^0 |/ c
#include <fcntl.h>/ }; R. K: U  h( k8 A$ H  p/ K0 ]

1 a1 L  k4 e+ C0 S#define SHAER_RAM_BASE_ADDR    (0x80000000)   & {3 ]+ B' E5 r6 C; u2 X
2 ^! J, R' i+ {4 t/ _
typedef struct
7 t; x! n4 a5 A% M( i. [; y{
# Y9 R! @1 r+ g) i' Y+ T6 X        unsigned int a;: ?; X& @1 z$ I2 s
        unsigned int b;
- f: j$ R% W6 i  n        unsigned int packet_cout;
* _. i# I5 S* K) n}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;/ V6 d& N" C. l) D1 b  \: c0 \( G  a
) \' O* o, [5 z: p6 ]
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
" Q! j0 Q/ T/ z+ runsigned int count_copy = 0;
2 ]1 `: }9 [  H9 {) T, ?% T4 H9 f7 S+ m: Y' O  m+ K
6 X0 g1 o* f7 A/ j9 K2 P4 @  g
int main()6 l6 X: y3 l3 M
{1 M* {# q5 v( ^( i$ o5 f
        pRX_MSG_PROTOCOL pshreRAM = NULL;) y3 i6 `. w/ z6 Z: S5 u
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
$ ?8 E& i/ D1 i( i3 Y: v. b- Q" s  T
        while(1)( V& c9 y1 ~0 B! L. }
        {2 Y  [+ f( c8 Z! d3 R
                read_MSG_buffer(pshreRAM);+ z- G/ d4 q1 i2 y5 @3 C. u5 ?4 _  f" h
        }                $ k3 h% B  m1 S- \% g* K
}) |1 f7 V% n. X# `" {
/ H1 G. ?  f$ q) W* b
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
( y# I) M5 N/ c; R0 B" a2 X$ ~{* ~# P/ ^( n" @
        RX_MSG_PROTOCOL buf;
1 u# W: q# f4 k3 p- T/ e        
2 d) `& d; @9 V1 t        buf.a = pshreRAM->a;) i6 ~) @) T7 Q8 h: z
        buf.b = pshreRAM->b;1 p/ a# o/ M! _
        buf.packet_cout = pshreRAM->packet_cout;% |% E( l# W6 Z  e) c' H
        
$ Y/ n* c! S/ r6 Y. T5 Q        if(buf.packet_cout != count_copy)' u' D. L3 V' C: L. [9 B
        {0 @4 Y" ~# i$ d0 A
                printf("a is %d\n", buf.a);) R# ]8 I4 b9 b$ s. @% Z8 A
                printf("b is %d\n", buf.b);9 k% w  C0 l7 N" F7 x  p
                printf("count is %d\n", buf.packet_cout);
1 ]; D3 V6 f6 v) n' E; r2 u1 a                count_copy = buf.packet_cout;( Q' A* S' M+ R: Z6 Y6 ]$ F
        }
; y+ P/ s" }3 D/ m( B        else
) e3 d0 C) K. j9 W& X, v        {: g& M- h8 @( A- ~2 p4 s% u+ J
                printf("No effective message!");
. S: F; B2 E( g3 D+ N# Y- F        }
: \5 P" ]4 \. I# i& T- P; v6 Y}8 `) k+ i5 b0 \5 G( X: d* y
& Q# [' u* W* t) y' G# ~
) i% f8 q" T8 z4 R6 S9 ?
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
8 Q0 z, i) f7 F6 {+ e) C0 \% @# a使用下面代码,对内存使用了mmap函数后:% t$ e# q; i; g9 N  H
#include <stdio.h>
- o( U+ x2 Y9 d) m#include <unistd.h>
1 x. Q3 `) \2 I#include <sys/mman.h>) C% X) L1 s4 w; S" b; ]9 t1 i( W
#include <sys/types.h>( \& U) P" K. {* Y2 b' I3 X& D
#include <fcntl.h>
) {$ {, T5 z+ c) K) F# U. V8 O+ W3 k; P5 X
#define SHAER_RAM_BASE_ADDR    (0x80000000)
( X. v  _, e- T% ]#define SHAER_RAM_SIZE         (0x20000)   $ q5 U# P- d5 {+ R: B5 p8 U+ I
& d6 y, b' m8 I+ x
typedef struct
7 e3 x& J9 P3 _; o; s{
9 T5 `% ]! B7 H% Q! X$ q        unsigned int a;. w3 G: S: R. ?6 `( Y0 c! p
        unsigned int b;% P; ^3 _1 t2 r" y5 J. [9 S
        unsigned int packet_cout;
; P( c3 g! k' ?. G4 f  z- q( f5 ^}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: ^* h" o: I! @; w: J' f  D& C% ]5 Z% ?3 F% L2 H' W, t
void read_MSG_buffer(int *baseaddr);1 g7 X# D+ k9 c
unsigned int count_copy = 0;
3 v* [' N& W# n: k, s( U
$ u2 N3 a! x% i0 L; t6 e. I$ kint main()3 ?9 X0 G& S% A: }9 `# i
{( ?+ j  x" j2 [: n6 }
        int fd;6 s* D* O: T* t
        int *mem = NULL;; X" M8 L) e- L8 i8 l1 j  J+ |
- x7 I. `+ D7 _
        if((fd = open("/dev/mem", O_RDWR)) <0)6 R8 O+ d, z. M
        {
: `0 k# Z  T$ q+ R. ]- s( Y                perror("open error");4 r% N/ e" m* r! T8 j
                return -1;
1 ^- [$ Y4 ?. Z& \8 d  ~9 `        }
$ L! }+ U- N. W# E! d1 f  e4 ]        
+ P5 b8 L/ C! O- M% S5 C3 ^        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
' N, R/ b, ^4 j$ l' \/ [0 r7 k$ p# l- P' \. k
        while(1)
! ~0 ?5 i5 N% t        {' j; V8 Y5 |; [" |5 q. ]0 f
                read_MSG_buffer(mem);
5 j; u2 _. x. j3 @& V% e        }                ; F' d6 q0 o$ \3 M
}
2 n% a# t5 c. I7 G- x3 J9 _. D# n* S
$ i4 ]2 V0 w; v8 q1 ~- W% Qvoid read_MSG_buffer(int *baseaddr)- i; u+ l# r; C  ~  V1 D
{
3 B6 Y7 Y8 z% L        pRX_MSG_PROTOCOL pshreRAM = NULL;
2 k7 [  ~( w, p0 A5 c, q
7 y0 y, }+ }& v+ l+ F        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
+ J" s# k( o$ O( c8 P: _/ X: A+ s3 c7 y; ~
        if(pshreRAM->packet_cout != count_copy)
3 m/ [, O% A( t1 l        {
( ~, M4 M6 l: s                printf("a is %d\n", pshreRAM->a);. M, d. N# k0 p% y
                printf("b is %d\n", pshreRAM->b);7 a4 C/ E4 i! n' a
                printf("count is %d\n", pshreRAM->packet_cout);
* J$ M/ O" c& I4 {, R  c! K                count_copy = pshreRAM->packet_cout;* r4 Y. q& \2 p/ U$ h
        }- U" y) n$ R  t4 u( y4 R5 w
        else# t$ d3 }( D& ~4 B7 x, G
        {/ Z! v& w& p# ]+ e9 G. b' k# Z9 d( ?
                printf("No effective message!\n");4 Q8 a" x! n# P1 Q
        }- _4 }, {$ {4 J4 }0 r# a8 |
}- m. R8 U+ V$ z- n8 A9 R5 i% e# Q5 A
: C8 H9 M7 X$ \: _5 B$ i) l. V' O
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
- N; K0 F4 s+ `$ j4 q! H$ Q: R' c, b; o1 [7 f
. t+ Y! `& ~+ x8 q+ g3 c

# A/ v8 A( k( ^. y; j  R
" @! w0 p0 L6 X0 \
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-9 20:50 , Processed in 0.038021 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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