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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
" K; M" o3 q% z9 K$ X3 d* a& U- }* y; d* m
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>1 f' I9 O( T+ W
#include <unistd.h>* P; `- J0 n. `9 a- v$ A; z# f
#include <sys/mman.h>
  s  ?& T5 E6 ~#include <sys/types.h>
$ F/ d4 m( [* L9 i8 P, }#include <fcntl.h>
4 Z3 M" C) f4 L( Z& Q, t; C; G; z9 q/ {/ \4 J: W4 \
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
* ?" S5 e* Y; ~" X2 M8 k' P& N0 _
9 h+ Y9 L6 u9 d1 _* L+ \typedef struct
3 `5 M$ n; s( D$ T) _1 ~{
0 W7 N9 {8 t& l& u        unsigned int a;& L; w0 v1 r# r. B7 U; P5 I* B
        unsigned int b;
) W7 h0 T) p9 C& a& O. K        unsigned int packet_cout;
4 r, X" V$ w* K& d$ w; L: E: x7 b}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
( a, e7 F6 s- Y* K& Q" r/ f3 L$ w' ?8 K  P
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
" F  |7 S& O, r8 R5 X+ Munsigned int count_copy = 0;
, u/ K" f! o; O( m9 @! y6 A* X8 t; [- h6 P! V
- d9 ~! s1 }. Q& n
int main()2 \1 M" D  q+ V# A8 J: F% g5 s7 z
{
- `+ D$ s9 n5 x4 r8 y. r        pRX_MSG_PROTOCOL pshreRAM = NULL;1 h  s0 Q/ ^" o
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
: f* a5 K, z% z" H( z( g, ^; i9 f* c
        while(1)
1 c) `' B* [$ @$ \* r        {7 B' {, T! ?/ K
                read_MSG_buffer(pshreRAM);
7 i0 e' Q9 A0 c+ S. v, F        }                % l7 i+ S& e! c& b. S) x, w
}0 n$ X; r0 u. Q4 }" c3 Y

- p5 B. N- @& Fvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
9 X4 x, v* W! W3 [+ V- `. ?. I{1 I* c% E/ @: W* @, S7 M
        RX_MSG_PROTOCOL buf;4 t( H( `' A7 C3 b
        
8 M% x" Z! g* F# q        buf.a = pshreRAM->a;, i& d2 a/ t# N: C  s# o
        buf.b = pshreRAM->b;- r0 P6 ~; F9 R1 f$ I; y% D
        buf.packet_cout = pshreRAM->packet_cout;- A: d( r1 q) {4 Y$ x0 s0 H8 P
          l/ d/ E4 E3 I/ x9 n
        if(buf.packet_cout != count_copy)  P* B2 W" X1 V, ?
        {6 Q' c! x( ~: q2 I+ K8 f) g
                printf("a is %d\n", buf.a);
$ D: o# H; ~, R3 M: ?' W                printf("b is %d\n", buf.b);6 {4 Y6 K( }& ]; G9 t' @
                printf("count is %d\n", buf.packet_cout);
1 A: m: H* b2 ?8 @7 ^                count_copy = buf.packet_cout;
% {  w7 ], J  y# A' c        }+ F' G3 v9 }7 I/ R6 O  @4 o+ G
        else
# G9 ~; o7 t0 p9 ~, J- |3 Y. O        {
" a/ t! w+ Z* Z# ?4 p                printf("No effective message!");  w4 n1 b( l# f. j- ~1 R4 l$ c9 O
        }
( J8 T8 D. `" J/ k# T}
, Z) m' v$ c9 u& z/ h# b4 O0 F4 f
) a! y7 v' ?+ |5 y/ K* a. Z  T% F0 z
5 Z5 z; G6 o/ e2 A但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
  q1 b0 O: k9 O' D' a$ X1 B使用下面代码,对内存使用了mmap函数后:9 O5 C/ E6 @! w7 Q1 X) s6 m
#include <stdio.h>
9 e0 X7 b" e$ G& W1 ]6 X! y#include <unistd.h>/ q- i1 h- [8 y5 @
#include <sys/mman.h>- |  C# ?( M8 |+ T4 G
#include <sys/types.h>
( I9 g3 z6 ~5 K# g& S, U2 o#include <fcntl.h>
/ X) }  h, Q8 o, {3 ]* B0 i
, p  @) |6 i+ r% q5 J. `: p2 g#define SHAER_RAM_BASE_ADDR    (0x80000000)# v9 r( x/ J8 p1 z9 s; ]' c
#define SHAER_RAM_SIZE         (0x20000)   
" V1 G& Z9 |0 m9 U+ {; {4 l/ v6 U0 O/ e% }4 H) c0 L
typedef struct
/ g% _+ M( o$ y! Y{$ |' @" W& A* C5 G/ d6 e1 R
        unsigned int a;
+ b8 U! }7 y* t! S& O- l5 W        unsigned int b;
' ^2 _3 R, J8 \        unsigned int packet_cout;2 ^0 U  q$ t5 G0 M4 n& @
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;- A2 B$ ?3 L- l* N# P- j
. o1 b4 y( v9 `) r
void read_MSG_buffer(int *baseaddr);
3 P( C3 o6 [5 Bunsigned int count_copy = 0;( n/ P: J1 c, H. X( V5 i
* j" S& x8 ?3 h
int main()
& [; ~2 y& R6 M/ d" q: j{
' q! d6 J0 U) G8 G( V        int fd;" f  T% b5 P: D# z) B
        int *mem = NULL;
' M" h( y  G. p5 p# F3 c4 u) n# y6 y( D, E
        if((fd = open("/dev/mem", O_RDWR)) <0)
+ [( m" G: J8 m* @! a        {
% V& y7 D" D* ?3 P) F6 B( z                perror("open error");
9 s/ k" \7 s) ^  y                return -1;, w' p! p8 g# m3 j
        }
0 I: S! {0 }0 x! H4 u. U1 b4 i$ ^        0 l7 j# P5 H3 D2 x
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);7 Z  z$ A+ B) ]" `. c" @. ]
) j+ w  l) ?9 o6 i+ s
        while(1)
% L6 e- u6 I8 b  J& c        {
" ^: k8 m2 e, w' z6 S                read_MSG_buffer(mem);
' G) {1 H' y2 \        }               
- G5 X4 c4 e5 d: y, Y" E0 y+ j+ ^4 L}
6 l. {- p4 `1 P+ B  L$ w4 Y' g9 M6 h: J9 Q! y* Y" ?2 C+ |# p
void read_MSG_buffer(int *baseaddr)
1 a1 M3 `6 \  ~: n8 g{
4 w+ L% n' e7 G* \5 o        pRX_MSG_PROTOCOL pshreRAM = NULL;( A: i3 j9 g+ J/ E" ], X% s
8 }9 D' E) L0 U/ O3 \
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
6 F7 j/ U( k+ ?6 h- x: q+ [. M* x% n% f5 A4 W% y
        if(pshreRAM->packet_cout != count_copy)- c; R; q; ^0 {. U8 G, Q4 Z
        {* `. ?  x; f2 A/ q$ @" r& |
                printf("a is %d\n", pshreRAM->a);
3 g. f- G* ^4 {7 E                printf("b is %d\n", pshreRAM->b);' ]% m! W( z, v' i8 V
                printf("count is %d\n", pshreRAM->packet_cout);
+ {" o% ^" J' G1 A# a9 t                count_copy = pshreRAM->packet_cout;3 P1 l, u  r; k# o6 R. o
        }) a' g. S: F% T& g8 F
        else
. A& Z1 Y  w  h; x. ?        {/ i' f3 l  \8 m7 X
                printf("No effective message!\n");
7 X( P6 Y& b1 U3 [' y  m        }
$ m4 s1 P' V* n" B  M5 ]}
, }7 I0 ^& J% S/ [7 A$ a6 B) N3 ^6 q" H
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???) x- A) S+ ~9 Y4 E9 I0 b% G
/ o1 y: d+ h7 C2 |
# z* y' y- t- T
) V* j3 }( e# o- ~- f* e

/ d1 m; R+ [" Q7 x' M' Z
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-29 18:31 , Processed in 0.039841 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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