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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
* ?+ v* G; Q. T3 ~$ O) [" [. \& [6 V: _+ J  M8 m9 a
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>/ u- r4 s" ~- y$ H% d
#include <unistd.h>' K2 j4 t/ k- Q. f& S  Q, c
#include <sys/mman.h>4 n+ J5 A$ f; d9 Q( O0 Y- {/ n
#include <sys/types.h>
. P% ?" S9 r' b3 z$ J- B4 ]5 m5 g#include <fcntl.h>
( S0 M7 h4 z6 V: i. C' R6 Q+ R* U+ v$ n6 e# M5 e  {4 h5 r
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
* |; \7 y7 H/ E0 u7 z: |
& g- [- c7 w* m$ Ctypedef struct4 `* c/ X1 e! z- x% y% t
{
1 \  v5 D* e( V/ h+ l: K8 k6 M        unsigned int a;
5 M9 y7 E9 I$ K- j: ^        unsigned int b;6 f+ w6 K) M3 I1 A. V; Q
        unsigned int packet_cout;
% A+ z) k6 m1 Y3 l! @}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;$ I* A! h; V/ E' H
$ J& Z0 B! O, f2 N6 I
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);* |' l& k) K: m. {+ U
unsigned int count_copy = 0;/ O, Q9 s- f" ?& e0 k# Z
) R7 }4 p% ^+ Q  ?
, p4 {7 r9 o8 D3 A
int main()( A6 c% w6 g: B( L2 y
{; a7 f. R/ T( x# A9 \- G
        pRX_MSG_PROTOCOL pshreRAM = NULL;) k. \5 |, N2 s  z5 \7 ^$ H
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;. ~: d; E$ z+ ?/ w7 Y% q

4 g1 X; O6 }1 @  V: F: \! o        while(1): p9 R' x; D( l
        {
4 b3 C8 R0 O2 R7 @$ v                read_MSG_buffer(pshreRAM);; T2 [1 X1 Z4 J' U7 D- p
        }                % j3 ?1 p2 C% l: B- Q$ v' V7 }# f& S
}2 x! x# O5 }$ Y1 d7 \

4 S9 Z" [, M. u; k0 Svoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)1 s2 e. _& K, h, m; s
{
; d" h1 n+ A3 T+ ]$ y        RX_MSG_PROTOCOL buf;
# ^: W2 I8 t9 z1 l7 @2 M+ Y        
+ I2 A: @- ?) b        buf.a = pshreRAM->a;
  }6 R: I! X7 |8 S% g& z        buf.b = pshreRAM->b;% s% i( l8 _7 C
        buf.packet_cout = pshreRAM->packet_cout;' y6 Y) v/ c9 s: m/ M
        
7 R- O9 M% t! ~. o2 I        if(buf.packet_cout != count_copy)
: u4 P8 g: N( W2 ]        {
, a- Y$ Q& H' ]  r                printf("a is %d\n", buf.a);
5 d& q1 c3 H- Q, m* v% V* A3 R                printf("b is %d\n", buf.b);
: X6 w# M3 s# d! Z: {                printf("count is %d\n", buf.packet_cout);. c  Q0 w9 Z3 p5 O! j! o
                count_copy = buf.packet_cout;
) b0 C: {/ O5 Y/ m        }
7 ^1 e0 u$ T) T/ D4 f        else
% j- I! u+ e" L        {  T7 {" y) P6 S
                printf("No effective message!");: e6 J, ~* B( W. I1 I" C7 i) ?2 E6 S
        }
$ J+ E; O6 j' S  P# _7 d# o+ a  O}1 E2 i1 Y' Y' O# ^& }/ @  T9 u

. l( B9 b" }- i
5 _% P( {* _2 B* z: v6 n/ }但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
+ P8 D+ y2 R$ b( z  k; B使用下面代码,对内存使用了mmap函数后:9 c, h* _' i: y' E! J
#include <stdio.h>
* g) a( S  O( j8 Q4 N. c#include <unistd.h>- `  _1 ^+ G7 r/ Q2 H3 R$ ]5 h
#include <sys/mman.h>
& A1 T- j( p: O* o8 J8 u#include <sys/types.h>" a9 Q. J) U2 W2 r7 c- a* A3 U
#include <fcntl.h>
" M3 s5 R% x6 w4 |2 _+ h# g1 n5 S* e$ d) |0 J) l& `. M! x
#define SHAER_RAM_BASE_ADDR    (0x80000000)
% R! w# A9 U( l#define SHAER_RAM_SIZE         (0x20000)   
7 f0 O6 {; V9 p+ k% n2 a# h3 k5 @0 D+ b0 j# Y
typedef struct$ u; i1 F5 n* C. h5 W5 w
{
4 z8 m2 n) y4 x6 u, H: T        unsigned int a;
; u7 I6 k) ^: U6 @4 q& a        unsigned int b;0 Y% ]1 x9 {$ D* A& h: Z
        unsigned int packet_cout;% |' Y2 P9 n! L$ F& p0 T7 K5 B
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;7 _7 [6 Y, O/ d' X6 z

. i! q6 E7 Z( n; }void read_MSG_buffer(int *baseaddr);# i  r3 ^# Y; K7 M8 w) G9 L
unsigned int count_copy = 0;
  M3 T) Z7 O, \1 f0 h
6 ]1 Z$ F' E4 F0 g' y) Rint main()) T  B9 J" R  f  z: d
{
! A$ V; J) K, `4 f        int fd;' B8 Y; r! x; O! Y
        int *mem = NULL;3 N% z! I- {0 d0 d
# O; W9 h, g& I4 w  P$ N6 J& q
        if((fd = open("/dev/mem", O_RDWR)) <0)
9 L& n9 z* K  I% w1 q) R        {: u& ?! Z1 y9 e- s8 K
                perror("open error");8 z4 r$ e& @" D' i
                return -1;
( ]6 n6 Q  J& c: }        }7 ]. x: K! [: L% D. M
        $ I9 q) @8 h: G0 e" i6 j, O
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
( E/ h5 P+ U5 W3 S) \5 H
- q; N' o+ Y/ L; C, @        while(1)" X1 a$ z3 z+ E
        {
/ U+ H! u( r3 S  k1 h  |                read_MSG_buffer(mem);0 }5 r% \2 h" V  T
        }               
1 l$ s6 r- R$ C. `1 i}
  f6 U# x% N( H# L( t
' P4 W" v  ?& w; `2 Cvoid read_MSG_buffer(int *baseaddr)
- ?- d7 N  F$ _1 k. s0 e{
' f5 D% \/ [- N4 E) a2 l- y        pRX_MSG_PROTOCOL pshreRAM = NULL;
# b% s" k$ N( F% F  m) {6 O+ ?
7 b& g  a$ Z5 K+ F3 `        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
, Q+ S4 K: U" e; Z& `
  E1 j  M6 Y4 ^, X3 o+ K        if(pshreRAM->packet_cout != count_copy)' X0 m- {3 }* h. p7 q4 ?
        {: ]! h: Y& }1 m
                printf("a is %d\n", pshreRAM->a);
1 x* B3 o; z: w) c' h4 i                printf("b is %d\n", pshreRAM->b);* C5 b1 A2 d- h: ]- q' O1 \
                printf("count is %d\n", pshreRAM->packet_cout);2 j, |' h! c# Z* D( n2 e: `
                count_copy = pshreRAM->packet_cout;  g& h- G) \% x. Q' V# v: ^
        }: G* |  }4 h6 E( z, w# d( C' v
        else
8 L- M5 W+ q& b$ `: N        {
( q" \/ O) l7 `+ C0 X  }, ~                printf("No effective message!\n");
9 W- s+ }3 s9 n9 Y+ ]/ Q! i        }% S& a* N7 c: a# ^) e7 ?! e. C
}& W$ [+ Q9 |  n( g! U

8 v+ y$ y# X# E9 b8 _没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
4 \7 a, g) I+ ~& q) C' ^* i2 @  ]2 r$ o
2 q% K" D& m9 ]4 _" B6 o
; x, W' o2 F- J. h( O5 F( ]
! ]# k% e7 F* _2 C8 X8 Q6 |
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-4 22:49 , Processed in 0.040245 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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