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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 " T) H2 J7 E4 `! B' s
! C" a. |7 J% P# f
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>7 K3 _4 X$ t0 p+ F% z
#include <unistd.h>, `6 a2 z2 ]4 w9 P  L1 V6 l) x- d9 k5 s
#include <sys/mman.h>0 U3 Q0 E3 y& [# f4 q' p5 @, @& W% k
#include <sys/types.h>: m# ~+ A9 V$ F- e9 x& S( ~, N
#include <fcntl.h>
/ ~" q0 S/ C3 H- ?
2 }; M) L4 V8 D3 c#define SHAER_RAM_BASE_ADDR    (0x80000000)   
7 ~4 o# z1 S: }0 B2 p  x! L6 x" o- f0 L# M8 C/ }5 p+ \
typedef struct
% ~/ l, p3 i4 A( [$ j, d3 p; a{
2 B  h/ v1 a: ?4 u# @2 ?5 a        unsigned int a;) x) C8 J0 h8 y
        unsigned int b;
5 \% ?+ f0 s; s0 `, f* {$ F        unsigned int packet_cout;  ^9 `% a# @; g5 m. @2 p
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;# H1 f  v- F: F5 T; l
3 x; S! K! b. }( M2 w! }' N
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
& G8 P  O1 s7 K/ U3 g; Q+ S) ?) ^% Qunsigned int count_copy = 0;
# O( u% H# v" z, y  S/ d% v! W1 K. `
5 T. s7 y+ C$ w  Q! J+ p7 w
int main()
0 `: t+ Y/ ^; N. {' X) ?{
, i9 ?; Q8 C+ Q        pRX_MSG_PROTOCOL pshreRAM = NULL;
' s5 t2 ?/ A# Y4 t. a/ F- R7 @        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;1 C# S* k/ J% P2 M( [( |) v

4 J" D# u1 W% k. l$ z1 ^        while(1)
* X. `0 l& H& i7 E; A8 b7 J* v, k        {: U/ d# c+ a8 W+ d
                read_MSG_buffer(pshreRAM);# i9 i' V3 q5 T3 j2 K7 o
        }                7 d5 E( \5 x8 p6 @: Y1 ~
}- d7 q) \( T* v' b, ?. b2 |# m

& c; o* t" d- q9 Y* c% M7 G/ Hvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
  j2 a- I" g  T! H{
7 b: ]; Y1 A" K( S        RX_MSG_PROTOCOL buf;7 o  d" M7 o! l: a' H6 _$ G( }: q% D
        6 ~! J" n+ ~& b
        buf.a = pshreRAM->a;
1 |/ J% A% O* @# _        buf.b = pshreRAM->b;. N; R' M8 U% n, m: W8 C* L2 l6 y
        buf.packet_cout = pshreRAM->packet_cout;
4 t: b+ l& _+ N. r) H5 f8 {        0 [. b5 @4 Y6 z  r
        if(buf.packet_cout != count_copy)) l8 W' U. p+ G
        {# w% f& [* [! P8 Q( k5 b
                printf("a is %d\n", buf.a);. W% ~% c8 Q* n9 r# [. L$ ]
                printf("b is %d\n", buf.b);
+ `; G+ |( e( q! z; X                printf("count is %d\n", buf.packet_cout);1 \! [) \4 n" @
                count_copy = buf.packet_cout;. Z/ m" B, x+ z5 v+ Z+ c1 `  R
        }
; X" \$ g/ f' Q- ~2 F* C        else
- M4 J) g, u( @* u        {- V3 i' w: b* Z) C% W% Y
                printf("No effective message!");
. W" D1 J2 Q, ^        }
( G/ Y3 ^' A" O- F1 N$ k9 r- y6 I}2 G9 u) g! s0 J0 _* [  E: X) }
8 @8 ~, W0 b* w* c% T

1 s& |# w, g$ _- A" g6 N但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。# n: f# f7 @" [( {$ i* D5 ?# \9 _
使用下面代码,对内存使用了mmap函数后:
5 k- w2 @8 }8 H* V2 }#include <stdio.h>
' P. S* T: `! J" A5 H3 [4 Y% J#include <unistd.h>9 E5 m9 B# v' `/ q
#include <sys/mman.h>0 C! G9 y) A! x& Y) W6 u
#include <sys/types.h>. C$ c5 t6 X+ i. F. j0 E4 h
#include <fcntl.h>
  N3 V$ W  }. T+ |1 R8 _) l
* ^# d! ~- n' N) E; _0 z% W4 u$ l#define SHAER_RAM_BASE_ADDR    (0x80000000)
8 Z7 K1 f4 {; H" s' n#define SHAER_RAM_SIZE         (0x20000)   ; ]2 M% a& w6 d" d) D  P& o
% V$ T; \3 N$ f8 p
typedef struct* z; b8 H! V; G. I+ P! E
{, ~, z$ o) ^. W! }
        unsigned int a;
. b7 m$ W. W2 c1 N/ N/ k0 v        unsigned int b;' u( C7 i& C; G9 J, M* c# r0 E
        unsigned int packet_cout;9 [0 S; j. ]; g4 E/ D
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;0 B& S0 v: B) L' L* H1 T) O

, o( C6 t- {5 z: ^void read_MSG_buffer(int *baseaddr);
( R- i# a  {1 Iunsigned int count_copy = 0;7 O2 j" s5 q! D% N$ B! r; }
. H$ j4 }, n5 n/ ~+ ]! D
int main()  j3 M% S& S$ T7 f4 `: }; e0 ?2 K6 k
{4 s" E8 S9 |8 ~0 ]2 ]
        int fd;; x, P" M& Q" c: ~- Y/ ^( B4 G
        int *mem = NULL;
$ L# `. m1 R. R% u* F$ s& ?9 i1 i2 e$ q3 d2 D" i
        if((fd = open("/dev/mem", O_RDWR)) <0)% X) h# Q$ ^5 ^3 Z; \# w
        {
; o: k& E$ q) D: y7 f5 ?                perror("open error");4 a* L% t! E! D& y) s3 q
                return -1;, r' H# I6 U$ q' g$ ~# I* g
        }# Q8 Q1 W* q# S3 m
        % T5 k# {: x! C1 U# Z
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
; O& w0 N7 X! Z5 j5 T* r2 O1 P) t
& w: C! h6 F0 k( P$ P. g        while(1)3 X& K  ?9 M% i% D0 E
        {4 i# }( k* a9 ]: F9 ]; G+ x
                read_MSG_buffer(mem);7 T( N, l1 c( _( X! y
        }                ) Z  l/ p( j$ \% C
}
% z  \$ }; V, n$ r0 B$ @+ ~/ Q7 P* R/ m( f( o2 L3 {
void read_MSG_buffer(int *baseaddr)3 D9 ^; ^8 q$ j! [9 C* r4 L9 p! C8 k
{
! O) R2 W; S. v9 J4 u2 y8 N1 B        pRX_MSG_PROTOCOL pshreRAM = NULL;
+ ]1 [! P5 ^1 B# ~) Q$ H8 u' `4 S# g% e  \! a  I6 o
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
2 J% A2 }  p, f; Z: Q$ ?
3 V' e( f8 ^& H) \9 Z3 I2 E- W! f        if(pshreRAM->packet_cout != count_copy)
( M! p5 Z; e  N/ u, p$ p1 n        {# s6 D4 U& p9 b& {' k1 p
                printf("a is %d\n", pshreRAM->a);: _+ @3 x8 {! e& h) o, ^6 p
                printf("b is %d\n", pshreRAM->b);" P% v2 s  ^: a9 k6 O  `' V
                printf("count is %d\n", pshreRAM->packet_cout);3 |& {% v$ a3 O5 M, L7 m
                count_copy = pshreRAM->packet_cout;
0 Z  r. p' c/ t        }
3 a* Y/ B1 C; i' }        else/ v! Y/ f  q. e5 L
        {
  f2 m! Z: i- s6 L                printf("No effective message!\n");8 |  D  ^1 _, r, d
        }
6 q. ^: u! I- d% Z) h, p- u/ @}
. K# |. c, ?% s. C6 p2 O' C
1 R8 x# c" c0 l. u- H5 M* t没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???$ G8 s2 o' W0 V* j# K; p

! X: E  k6 L' l5 }, S! {7 ~" u, i  `8 ]- }) P9 [5 M) `+ S3 k3 D
' k+ Y% N- V" U) d2 v$ q3 x; h

1 w" _5 [% `% k- a1 ?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-21 12:08 , Processed in 0.041670 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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