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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 " n3 y; w5 B  s8 y- y3 F
9 h8 k' d9 n  R$ J8 j
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
" Q6 `. ^5 a- E: Z# x#include <unistd.h>
/ @) P3 C5 O: k$ J#include <sys/mman.h>
" V5 T8 I: ?( ]& |0 _#include <sys/types.h>
3 r; X; _  j9 t  l. P1 l& m% [#include <fcntl.h>
9 R* K% A, B) W  |9 ^
+ Y, F% L# C2 P3 h, S#define SHAER_RAM_BASE_ADDR    (0x80000000)   & |: ]+ l; V) Z! A* `, }  }
$ p- H& q4 ~- y6 _3 {0 q) s
typedef struct
: G: O5 ]( O1 a2 ?6 ]{
  e# a. N5 g7 z% ]9 H5 f        unsigned int a;
* V# y3 w5 Z! I1 I: m        unsigned int b;
7 @; Q, {, v8 u7 ]' T' a2 S        unsigned int packet_cout;2 C8 Y& j" Z% V. m5 {3 S
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;& h5 x1 m& y- U8 ^& O( h" g0 g1 ?
# A3 Q- @- W3 N8 Y9 j# a. r
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);% P) Z( I1 Y& K8 h0 U; p/ p. X
unsigned int count_copy = 0;$ f+ P6 L, Z- U& Q) g1 d
1 \7 a0 K5 \- q5 f& G
1 n& k& p% Q3 q4 w. V
int main()
, Q3 O! A& d& j' c{7 [2 p0 b9 ^( I2 u6 M4 X; [. C
        pRX_MSG_PROTOCOL pshreRAM = NULL;- w: H, Y+ H) V2 n' X( }. B( M0 o
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;/ |' a/ P, n- E) y, {% Y
( M0 P1 n) d& N9 y
        while(1)
$ c$ r# D; B) ~' J; X& f# B        {) u  ?' T: {% ^0 {/ R% g+ u- [5 k& E
                read_MSG_buffer(pshreRAM);
& O' u5 `: J) D- n- [1 E! ]$ k9 w( Q        }                : y" r/ |% {+ I* x
}+ e# T. U+ w) {  O0 Z4 d5 I

6 m- l' G$ Z! w- k5 Nvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)* g* L7 A" H7 h( h2 d' \8 R3 r
{) |) @3 [% W2 [6 R0 M) z
        RX_MSG_PROTOCOL buf;8 @+ G/ G" w2 U; v
        3 q. A  l# n/ p; c
        buf.a = pshreRAM->a;7 R: O, e1 T1 g3 L  b
        buf.b = pshreRAM->b;
# Q- B# i6 i) G8 m6 J* U4 }" d        buf.packet_cout = pshreRAM->packet_cout;
  h8 g+ D" s8 F5 H        
; w- k, v; O* R4 Z% S& F) N        if(buf.packet_cout != count_copy)
  P) f# Q& a) h7 _3 q        {
: C/ s% u0 a, @3 v  n* c                printf("a is %d\n", buf.a);
4 v% n) U( U1 O2 q                printf("b is %d\n", buf.b);3 k$ B1 [" |" L% c
                printf("count is %d\n", buf.packet_cout);$ Z$ G- j  P! \/ n# G4 n% X
                count_copy = buf.packet_cout;' M5 o( n/ ]- w/ T* w' ]
        }) D* R. ^% @. u% v) b2 |/ ?5 v
        else9 S0 E: N5 I. _$ p& T( o5 ]
        {
- y& [1 h  Z9 \# D                printf("No effective message!");
' [% o( {+ ?( u$ L: _+ ]$ i: E1 Z2 \( y        }
/ }8 J0 w1 ]9 U( L0 n. n# D. e8 M+ c}
+ x7 @8 _& |% o0 U, y# ]
, Q$ Y2 q" l( F  i6 D
: n& ^' s" ^9 C但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。" N$ S$ Y2 C1 ?  ]1 h1 v) g- W9 R
使用下面代码,对内存使用了mmap函数后:3 B$ d; Q3 ^2 a) p
#include <stdio.h>+ A# b. w. d5 Q0 R* w+ \
#include <unistd.h>) R  L" R6 W4 L1 {
#include <sys/mman.h>8 p! J  I7 g- B
#include <sys/types.h>/ I1 e/ k( m: i9 c
#include <fcntl.h>4 r$ ~! H9 b. p; q$ p0 f) \/ t1 a9 B

) V( T3 e2 I% s& J2 U7 Q$ G0 u( Y4 `- S#define SHAER_RAM_BASE_ADDR    (0x80000000)
+ z+ ~2 G5 P( J/ G; \#define SHAER_RAM_SIZE         (0x20000)   
8 G7 f( y' U9 W* d! `- Z
7 Y1 m' H% v2 s/ E! j0 etypedef struct
+ X, j- M0 r7 K" y) P{
3 B9 f3 [5 P. v8 N) Q        unsigned int a;
/ M* p; b1 G7 L) j( _        unsigned int b;
( P, X, @4 c9 R' r  a7 ^        unsigned int packet_cout;# b0 r9 {5 E% j; `( E; r
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' S/ M# Y  \2 B/ ]- X9 J/ ^0 ]% n' v' w# {8 L+ d* K; Q
void read_MSG_buffer(int *baseaddr);
% y" ^" A9 N' {5 l  ]unsigned int count_copy = 0;
. ^+ `' p! P' F2 M: Z4 X' X/ ^5 p$ R8 p6 c5 q, p) {" p: F0 U& ^
int main()
% b# M5 U! t/ ]' |& v" A8 `{1 N# C9 W! F+ t2 O8 c
        int fd;, Q0 o* x. }. r. ]
        int *mem = NULL;6 g9 r: {3 p5 d! B7 u+ k7 l

# s3 E. Z  Y$ w/ N- e' @( S7 O) ]        if((fd = open("/dev/mem", O_RDWR)) <0)
, q3 X/ o/ C5 L: S; h3 c        {" u1 W. _/ [; ~8 Q- c  m
                perror("open error");5 l4 s% o$ y- ~7 s' v7 b+ s
                return -1;
7 P# a8 f: R# {, V/ S        }6 c- ]5 N* C; p+ S/ P! \& D
        
$ \1 _# ]% m. u( }        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ r" H8 C/ X( G4 x0 Y7 ?
6 F, s3 `; o3 P  r5 y2 }$ t        while(1). i/ J- F  j7 }
        {
# H9 `' J( ]/ C5 s0 d                read_MSG_buffer(mem);
  d3 @( K; r9 B1 k& j; r- Z        }               
& T5 O0 K" ]2 [4 r/ o) a4 @}. @7 M: s/ f" ^$ t( l5 ^
& m1 D  @- o5 S2 \6 ~
void read_MSG_buffer(int *baseaddr)
7 C$ ?" k0 y7 T{
6 n9 C  g3 g5 p& F  a7 V        pRX_MSG_PROTOCOL pshreRAM = NULL;
' q" {+ L6 O. i6 |$ k1 K0 W
4 r/ x2 ^# g2 O        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
  \# [0 _2 m' g, G/ {' K; {& [
        if(pshreRAM->packet_cout != count_copy)
% E4 M  v( @$ L6 a; i        {
& b2 K0 v: B6 p: d7 p                printf("a is %d\n", pshreRAM->a);
; H2 Y- G3 U0 k7 Y                printf("b is %d\n", pshreRAM->b);9 ?3 G' B" a4 z5 Z' B$ d- o
                printf("count is %d\n", pshreRAM->packet_cout);' _8 l/ o# p; d/ ?! g2 h1 D
                count_copy = pshreRAM->packet_cout;
9 U: E& `3 n7 |) w8 o1 ^        }# C% O" j  ^! i( |4 @
        else6 k7 N& u& ~8 m% x% b% P8 B! Y/ B
        {, O1 C7 Y. p4 l8 s2 R. p0 _+ B
                printf("No effective message!\n");+ I) W/ Q8 z( V5 `4 |" Q3 j
        }
0 |/ W6 A/ y+ A" K/ R" u}$ x5 j( b1 ^$ P" d
2 Y- P& z% f0 u1 v& z
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
" d3 Y. A  n3 j* p; [5 C+ A
0 W, {. _1 q6 }$ j
4 k$ K( [0 H# m9 O: P. X
: u& x& H% v% r6 I  ?
* c7 h$ R' e) Q" B$ T% ~/ [+ U
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-2 02:20 , Processed in 0.042497 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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