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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 0 F% \$ I3 j- B5 t, E+ A$ k
8 e. N2 ^( O; s# |" D
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>% \9 h9 H% L$ L, x% ~
#include <unistd.h>
: D4 Y/ ?4 Z' J8 b" B. ?#include <sys/mman.h>
: Q, ~/ Q& B: m9 X6 N4 e#include <sys/types.h>5 p  p3 f* K$ t" v7 Y0 _* m, h4 K
#include <fcntl.h>; f/ Y8 X5 t% ?8 i

* ^5 v7 U/ `5 ?( z( M/ h#define SHAER_RAM_BASE_ADDR    (0x80000000)   - u8 Q/ P$ w: u1 B$ u
; j7 g; F. y; _& c1 g
typedef struct
& e8 d, {- Y  l& {; g{2 A% m! S1 l, v) d4 G
        unsigned int a;
  Q% i' N+ A# d        unsigned int b;; t% M( {% z" _, S. r8 K
        unsigned int packet_cout;
6 K: V- U0 x$ [; |5 a- l( m}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
( j) j1 [: t) L$ `
0 g4 D4 n/ W- K/ v! m8 Hvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);% Z6 r7 B; B& v$ W% ~
unsigned int count_copy = 0;
1 n1 I- i4 x: ]+ q: V* z( A- p
/ N2 x* U9 m8 X, k/ e5 o9 r& V6 ^/ T6 c8 ^* F" f
int main()
) P' N/ w& f" q' v- t/ y{* o* X& E% s3 n1 W9 p' u3 U6 t
        pRX_MSG_PROTOCOL pshreRAM = NULL;
, \9 @$ D3 t0 Y" ^        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;0 A, A$ A6 p8 P* S
+ S) n5 P' J/ T& |. k2 N" I2 N1 C
        while(1)) h/ P+ o; ^9 J0 B# p. i& N; b
        {
3 y+ G0 E5 t$ {* i: n                read_MSG_buffer(pshreRAM);/ b* n2 }$ Q& U
        }                8 \( }& Z) ?* ?( n) n
}9 L' W1 V/ i$ y* F
$ n% n" [. c( v" N* L  l! e& g
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
, c  x) |: r& d2 B4 r; i$ o4 c7 {5 w{0 {- k/ X! k8 W
        RX_MSG_PROTOCOL buf;* |7 E- f$ b' ]" u* }1 h: c  z3 n
        
' K1 m- O5 p7 q1 Y& F        buf.a = pshreRAM->a;  Y3 m! I. s8 R! L, ?; z# x8 c7 B
        buf.b = pshreRAM->b;. e/ |  O9 v  e! Z- F* \2 b
        buf.packet_cout = pshreRAM->packet_cout;
9 F3 i- G6 w( \0 `1 T( u+ W8 @        
8 W( n6 g0 I# }% U) [        if(buf.packet_cout != count_copy)8 j; E# L8 k4 i
        {
' f! q. j3 ]9 a# v                printf("a is %d\n", buf.a);/ m) _  i. y+ s& w2 V
                printf("b is %d\n", buf.b);
% ]* @8 W8 t4 m( P. n+ F                printf("count is %d\n", buf.packet_cout);
% |8 R# \: y; m, `( S0 ^                count_copy = buf.packet_cout;
' Y. E3 C0 I, Q$ S9 y        }& q0 G) _. M" @! X0 R9 w5 G% v
        else
7 s/ i0 O$ m6 x4 J& w        {
3 F6 N4 ]: b/ }+ c9 Q                printf("No effective message!");
* e! S$ N+ X% [8 [2 i        }1 v- d, `5 |. I+ Q
}
5 i' m0 n6 r! L8 ]+ x8 J( e( {1 U/ B+ p" ~- P3 V" Z. k& Q
  w8 m$ C5 B5 i+ `; u1 j9 ?5 J
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。* M; V) x5 }" ~. u) h! V9 w- m0 u
使用下面代码,对内存使用了mmap函数后:
4 x& ^/ X' X" E#include <stdio.h>
; v' r9 W7 Z5 J8 A/ j" t#include <unistd.h>$ r: [7 y' \: c- r: O1 D& Z
#include <sys/mman.h>5 E0 L6 G. }8 m5 U) |
#include <sys/types.h>
' c1 e. Q. S. @& V9 E- b#include <fcntl.h>, L) X, h' U0 S4 H) T; Y- P

1 X8 k4 ]( O6 L# A1 ]' P- `#define SHAER_RAM_BASE_ADDR    (0x80000000)% n. V$ ^2 {" q1 S& b
#define SHAER_RAM_SIZE         (0x20000)   
2 ~- l! _  W" {$ ^! W6 b; c( d8 O0 g. E0 B% h/ A0 @; Z, p
typedef struct
; |# o% W% i& Y" U3 J{
1 g. o! u4 T- Y: f        unsigned int a;$ y4 z( h" H3 J* |  j
        unsigned int b;
4 G3 e6 |2 L7 L5 @* h- w9 a2 k" s        unsigned int packet_cout;* T" M- `; W: a# r! g4 \  \
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;! x4 p8 s  w' o; A% R
& `: ]1 x* V& X* s* u9 q6 i# o7 A1 a
void read_MSG_buffer(int *baseaddr);- X9 X2 q! H% i2 N7 Y
unsigned int count_copy = 0;
2 A) v. j% j. H7 n" L" P" A6 A8 F% V. x/ P, a
int main()+ g: D* s, S3 N* p4 m6 M- S# F* a
{
, L5 Q5 j" h" W! T, {/ q        int fd;
7 c: Z. S, P, c( \        int *mem = NULL;- h5 @8 O" A" r) F& e$ K6 _, {

. c, c: i) X* ]4 K- g) r        if((fd = open("/dev/mem", O_RDWR)) <0)9 S0 b3 m; `" ?
        {  z, b% I7 \2 o4 N, W" \6 D
                perror("open error");! `% X+ y: _% }& Y* h7 Q& Z
                return -1;% f+ E3 c( _! K- \6 ~9 |
        }
9 y: h; y' e( l* l- s$ ]        
7 l9 _6 _! N  X5 B* U7 B' r        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
2 f7 C1 P9 B' k2 ~
3 P9 q) w6 t4 C1 E. s! X9 s        while(1)  z/ ~) @7 Y& y' {, t/ h$ Z1 x9 K
        {3 h  ]0 f$ d- ?5 A/ P) M
                read_MSG_buffer(mem);
! s/ z/ o& o& A+ }2 F        }               
3 E4 e$ v4 Z' W0 A4 _/ ]) _  K}' f/ S/ A% j6 n. S" j

' t, K  r" M8 k7 q4 H% X3 G/ g+ hvoid read_MSG_buffer(int *baseaddr)' C8 D$ a4 D# q: B% G5 Y
{% t' O# ], T- o, S( z5 K' s6 O
        pRX_MSG_PROTOCOL pshreRAM = NULL;/ |5 S( `3 W1 E* ^$ }1 y
+ m3 x+ H8 o* x0 n( A
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
6 n1 Z8 p  q5 s, l
# z( I+ h% D, V# s, V- B% `* @        if(pshreRAM->packet_cout != count_copy): ]  ~: V; j$ j2 {8 F2 f" U
        {. j* d6 P1 R5 D1 d6 b6 m- _* |
                printf("a is %d\n", pshreRAM->a);
# v# i! h9 B0 s5 q6 s8 F0 b2 j                printf("b is %d\n", pshreRAM->b);5 U8 j' {1 B7 B. ~/ Y3 N
                printf("count is %d\n", pshreRAM->packet_cout);! r# S+ j6 a" S. R4 g
                count_copy = pshreRAM->packet_cout;$ l/ Z/ H% K8 q3 T) H$ o
        }8 _* R, L6 @# S1 u- `; Y, Z
        else
. L6 w* d, S# q1 |: K        {2 u  A4 C- v4 n: d& K, Z$ L: {! v
                printf("No effective message!\n");1 b7 P  v3 p+ K/ v' J  X0 c
        }
* a8 S# t6 ^# r* x8 }}: z  `  L) f$ c6 [; O
/ v" j) v3 T" U  W5 a& M
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
" B. J6 U: F2 O( q& S" d- ]% \+ a

+ w9 s7 V  |" _5 k
" l/ T2 p" t$ r2 D/ B: H3 s+ T' I. X- D, e
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 11:51 , Processed in 0.038715 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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