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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑   |) z/ n2 }) F: S% O9 [/ q
) {; X, O5 L! `* W6 _
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>0 b8 @  ?* m7 l' D. P/ O
#include <unistd.h>' o) M" A# w0 B! B( _
#include <sys/mman.h># {) `. W* U$ p: P
#include <sys/types.h>
  e. j# T5 Q, y" e#include <fcntl.h>
- G7 {' H, z+ W5 G  ^
$ }9 ^* F# F) a) C#define SHAER_RAM_BASE_ADDR    (0x80000000)   8 ~: z, D* R: @; A- |

; U! V3 s- n* Ptypedef struct
$ a7 L3 I" f1 ~: j; H! _! k{
1 W& Z# W: V7 q; n+ [        unsigned int a;
9 t1 c5 H& p. u0 h/ o8 j; Z$ _        unsigned int b;
3 D- w( l# h9 B, ?        unsigned int packet_cout;6 z, k2 l5 w( w5 I& f
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) {/ Q/ \! f) K& k
  R4 p7 {+ @+ Z. |" v9 Y( R3 _
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
: u4 z; I: `+ ~& F# [4 L$ Munsigned int count_copy = 0;
( m0 ^* P5 P! o- o# w3 j: r; ^" x  F
& u3 V8 [' ?! q0 x0 l% p' j
int main()
( C/ y6 Q! I4 I{9 U4 X) f; Q9 h* {7 m2 F
        pRX_MSG_PROTOCOL pshreRAM = NULL;  E( i/ Y; v+ [0 I3 D/ O
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;7 P# g% g& Z: z( Q3 o9 Z7 J

5 {  F8 K, {. z* k        while(1)
- D" c3 J5 K0 L        {. P6 g8 u* m& A3 P
                read_MSG_buffer(pshreRAM);
; y( a8 i, N5 w        }                9 R% x9 U- R6 O( A6 e2 `+ ^/ W! w
}
0 a$ O6 K2 F" G8 i) C
& U/ ~" S0 N' c) ~9 m$ _+ ]void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
: I* y' e; c- P) I7 q% Z# s{( J- q& F' w* x" T: v$ f
        RX_MSG_PROTOCOL buf;# S, D, Z/ g; \. i% l* B# q3 h/ r
        
- ]& c0 _. N% o% e5 U8 d3 t$ o7 R, W        buf.a = pshreRAM->a;$ l5 l# \* V6 a+ R! M0 m! ^
        buf.b = pshreRAM->b;
1 E% w/ l/ Y3 d2 |& d; t9 T        buf.packet_cout = pshreRAM->packet_cout;
/ e) C6 w, m9 J8 f& ~        
6 y3 w; k- k# i2 i" N" F& ~        if(buf.packet_cout != count_copy)4 f8 j6 \% G8 d3 ]# d- s
        {; k# N, P1 z0 X% ]
                printf("a is %d\n", buf.a);' j# M+ i2 n8 ?: @& C. G& g
                printf("b is %d\n", buf.b);  ^! s# K: _; W  T$ |1 S
                printf("count is %d\n", buf.packet_cout);7 @4 v7 |3 a9 ?2 y& G0 o" @
                count_copy = buf.packet_cout;3 q, A9 v; y/ O+ Y' {5 k: ?. r
        }
# i; Y! d8 u1 t; M( B8 w4 a2 m/ P3 N# W        else0 B4 D# }1 v+ {
        {- C3 u% s* l+ y# I' F/ a  x
                printf("No effective message!");% p1 Y9 s* V- M( f; v2 S8 C  U3 h
        }
9 N( G' Q" G+ ^- |0 F5 ]  n0 C7 j}
/ Z) C  K$ X4 u4 S" ?/ u$ \5 Q2 K3 `

% o. j# }  z, q1 u但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
' B# [7 N9 p  c( w) P使用下面代码,对内存使用了mmap函数后:
, u9 L0 M# F: W) v' n5 I+ u7 ?: l; k#include <stdio.h>
8 ?) [2 t+ I) z% ^* G5 d  T#include <unistd.h>, y9 O; ~7 b% {/ E% }& z
#include <sys/mman.h>* r3 J7 Z* T5 \* I
#include <sys/types.h>: n  c# V) S* ~4 E" @5 M8 I
#include <fcntl.h>3 D& h9 ?' F7 r) T3 I
8 Y3 E" z% E9 n9 I" d3 d
#define SHAER_RAM_BASE_ADDR    (0x80000000)( `: \& c/ z3 a' [, X6 q* D/ s8 e
#define SHAER_RAM_SIZE         (0x20000)   5 w7 g- x1 K9 N( d' E1 v; t7 ^: \

( ^9 E6 u+ E: C2 ?' f: ltypedef struct
( y8 s# |( c) ]" g{
! Z9 b1 a  g2 Y8 r1 V        unsigned int a;. A: i/ v. K& S) G' d3 i& y& ^
        unsigned int b;
8 v% H6 h8 G+ G) A! S3 P        unsigned int packet_cout;5 t( F$ X# R: l
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;: a; K' d7 L+ M6 Q1 c, _6 M

( h! P, |6 [' k1 L+ l! h  Qvoid read_MSG_buffer(int *baseaddr);3 s! s1 M' Y- `7 ~# T
unsigned int count_copy = 0;
7 ~( Q2 R+ y& G) B8 D4 w
: @2 N- ~. `2 H' g; pint main(); q4 a9 z3 s5 ^0 n8 T. ^# d
{
( X' L, x5 a- D- l. b        int fd;* T- X5 Q  {- G' }
        int *mem = NULL;
' l" u% @; l9 l2 k! y  m6 r7 _: F
& m$ R1 Q! d* `+ H3 _4 Y/ G        if((fd = open("/dev/mem", O_RDWR)) <0)
& z. L, p% [& s; z! M; X        {
. o. o+ k: j9 H                perror("open error");# _# q: R# Q/ S' W3 D, D
                return -1;
5 c0 B; d; G3 t6 K        }: X; ^: U8 j4 E! n- w3 X( \0 Q' ~
        * s9 \1 r. W# h/ k' G
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);+ O% d/ D: m4 U( w, F6 c; i$ B

: {; F; p' p, `        while(1); }  Z- h" |% E
        {! p# D: b) F  ]* X* O* E5 `
                read_MSG_buffer(mem);
* a5 z% b4 T' W        }                ' h: d) a; c# m& N
}/ Q8 v! t( Y1 }7 Q* F  q: w5 @8 c& |
7 b; ~5 _  P! B
void read_MSG_buffer(int *baseaddr)( t4 s7 D6 F+ N
{
3 z$ _6 K! H$ @        pRX_MSG_PROTOCOL pshreRAM = NULL;
0 Q/ J+ E7 [5 k# c! C1 J" H" `
# g- Q" n) k, m0 j/ p        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
3 U5 h1 m5 d6 G
! R' T7 ~1 P$ f; O0 |0 G2 a1 I        if(pshreRAM->packet_cout != count_copy)
1 w6 @" l" j2 x        {
) G* s7 }* F0 u$ f5 e$ z: q& N                printf("a is %d\n", pshreRAM->a);) y* U9 t. a% h/ P
                printf("b is %d\n", pshreRAM->b);: g) d1 H! y! E% a1 Z
                printf("count is %d\n", pshreRAM->packet_cout);/ m! Y/ E, y; e, D0 _1 ?7 \3 S) y
                count_copy = pshreRAM->packet_cout;
2 C3 E) X7 q7 a$ [( a* S+ Y        }
" C. w+ c  v9 q6 P* P8 k' O        else
* @# Q( h: R2 {2 h$ s$ ?        {
7 \* W/ O* h* L& e9 U; E                printf("No effective message!\n");3 N4 i. s8 c# d  l
        }
% W2 M- c; z" w) [/ z$ D' j}2 R3 C8 g3 u+ }+ S& R
) `  C, a: N* ]$ o
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???" r" i: V! M% ~( N! |
& Q7 _# Q9 A) z8 f8 m2 c
# J8 [7 ~' I$ r$ `. n8 d3 V0 x6 h, N

6 ~0 R" c" [) ]( N5 m
8 G3 W! _5 K  h( {* m9 i% S
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-31 01:42 , Processed in 0.040189 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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