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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
8 N, h* L2 U/ k6 p: v8 Z6 }+ B
! c" Q; M; q# w# B/ B( X  I! `" DOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>" ^/ |' ?  k5 w  ^9 n$ E# Z; p
#include <unistd.h>6 L4 g0 O. D0 b7 C- ?
#include <sys/mman.h>
+ c$ J. C; i& o7 i6 @' m. R  j#include <sys/types.h>: P1 X. ~0 B) F6 a6 A$ j
#include <fcntl.h>
- v% ?$ I" z* o* x' {% N! f
8 W, F3 u1 M8 t6 z#define SHAER_RAM_BASE_ADDR    (0x80000000)   % d6 b0 @# X1 k! d/ L% r/ }; d

, I3 l5 K- I4 M" ltypedef struct
. Z8 V9 w5 C$ R. {9 F8 S2 _{! m6 u% z# L7 y9 T
        unsigned int a;. y+ N1 V4 X% F; n
        unsigned int b;( D! M, v' F$ {8 E( T
        unsigned int packet_cout;" `9 D  v3 i  r6 f- \* q1 P
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;; u( @8 |9 X* R: I
8 N$ m0 J7 t; X; @
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);) o+ D* R) a8 j$ P( h- n
unsigned int count_copy = 0;
; ?9 O! j) W/ N7 Y+ j% R! g4 N; [  t

3 a1 r" r+ N' R1 i7 B6 k% m& m* y+ ]int main()
/ r! K, B* ~5 ?  m6 d{8 R( ^3 V) i1 J4 s0 m: |9 V
        pRX_MSG_PROTOCOL pshreRAM = NULL;
  w  x, F* R! ~: _/ E        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
* c+ W) u( I- F+ O: n
$ ?/ d  h, i% H7 p' L' s; c! ^7 m        while(1)
: M* ~2 y+ c4 k: d% `1 F+ {        {
- B6 I& |, n0 W/ q+ I2 P                read_MSG_buffer(pshreRAM);, r9 K1 Z2 R1 X  G+ B
        }                : K. f1 n- r9 i) T" k
}9 X) [0 x  H) B& ~/ {3 W: B' k! A

" D) V1 O4 j" I9 g7 ]1 Rvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)5 }* _2 a5 O$ w4 h* c( `( k  B0 t: n
{8 p% t, H3 b* a6 k$ i
        RX_MSG_PROTOCOL buf;4 D: ~6 ~3 g+ ~6 q6 N% q
        
1 y0 \) L1 D4 q9 T0 j        buf.a = pshreRAM->a;
/ n3 p; Z8 N. z. l  z+ |        buf.b = pshreRAM->b;
" Z3 q5 h& \& N/ Y7 e* r. h        buf.packet_cout = pshreRAM->packet_cout;7 V/ A8 ~1 n- \! }
        / m* p( f3 t& h
        if(buf.packet_cout != count_copy)
6 h0 `0 G2 P* d1 t6 u! m" W        {
7 h$ w; n4 l, p6 b- `4 X3 v: F                printf("a is %d\n", buf.a);# A+ Y9 J4 _+ N% L" D
                printf("b is %d\n", buf.b);
& s/ O* o( V1 O* u, i. X                printf("count is %d\n", buf.packet_cout);  C  c# [( }+ ^2 `. K4 ~
                count_copy = buf.packet_cout;1 }" Q5 Z$ m4 \6 N( e7 t4 k9 ?& W
        }
6 D# [- v0 c4 b: v6 k1 e        else
& R$ }% E; ^9 ]% Y9 N9 P2 ^+ h        {5 Y9 s6 I; _9 f& C
                printf("No effective message!");$ D. Z* ~0 v, }* A* n* j; F& y* \) j
        }- v/ H2 q* g! {. I- A
}
# b& Y+ N8 ^% i) s3 _
- L  a7 ]( B' R& V' }% w
( [/ j! z9 \3 u9 |( M' P8 p但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。, V0 z6 @4 X8 j$ `9 t8 b/ A$ ^. A
使用下面代码,对内存使用了mmap函数后:% m5 ?0 U/ f0 I  M0 t
#include <stdio.h>) n3 `! v/ B0 e0 N
#include <unistd.h>
' D6 J# o9 ^( r9 d#include <sys/mman.h>
( k9 [* D+ b3 R& E1 b#include <sys/types.h>4 h: o8 I. V3 m. E. s7 ]
#include <fcntl.h>9 g8 W8 D& b( z; `1 M* e9 }
9 Q- U# V2 L& p, t
#define SHAER_RAM_BASE_ADDR    (0x80000000)
  m- P/ Q7 a- P9 y6 H' a4 g#define SHAER_RAM_SIZE         (0x20000)   " N- x% @+ a8 @3 m
/ B+ U/ Z2 T, p" s. K9 q
typedef struct" K" m! r' J2 V6 j) m
{
; w, x: m2 G- t        unsigned int a;9 s  \3 ]) g4 n; ]$ G, g6 w6 Q8 I
        unsigned int b;
7 g4 V) k( U. C: f% `        unsigned int packet_cout;
* y6 ~3 ]  {; r  l+ y}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;0 U* d7 p$ H" G- m- @7 h
) k- W" J3 w, Z1 L) E4 N
void read_MSG_buffer(int *baseaddr);
! n2 Z( p1 J: V: `8 @+ ]3 u/ Kunsigned int count_copy = 0;
& o( m& [' F, f. m! t8 e
$ e! T$ G  i: }' c6 H2 i2 fint main(). H  P3 M# s! v/ D% r3 a3 n* P) c
{- n" ^( e, j# A* b; ?
        int fd;
! k3 u7 x9 O4 E) g        int *mem = NULL;- H) P3 C$ J7 W
8 v- L1 p0 |1 W
        if((fd = open("/dev/mem", O_RDWR)) <0)
% T& c! J: ^& J: \+ S5 r" \4 n/ T4 N5 z- J        {, n7 V2 l  Z% [" E/ x; x
                perror("open error");9 W. g  M! R4 B7 |5 q
                return -1;
, |6 g* R$ i, k7 j7 f        }: I( F# q' a' r8 \
        
3 X; ]% M8 ]) Z' ]! ^% v        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
) r6 g+ m9 x: Z7 ^& q% q( W/ E
- e+ Z% g, O/ f2 V6 P5 F0 N1 _6 z        while(1)8 v; J5 i: S2 [- g+ m
        {+ _3 J& `0 t/ b- R1 A  y; Z' d5 h
                read_MSG_buffer(mem);
4 U' J, j) j3 i: i7 s; M        }               
4 J& f2 c0 f0 d$ [% M3 B+ Y}
( J, W' t% P. i/ D: j8 ]! K, a2 r$ J$ m5 n* [
void read_MSG_buffer(int *baseaddr)( u4 L: f# h' D( B; @
{
$ P( F  S7 O0 B+ o7 R; X        pRX_MSG_PROTOCOL pshreRAM = NULL;
& P, T- _; F4 c3 Q& A( ^, C' R
7 }# p. i: s/ ]) u: \2 H        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
  h; P4 S; X. p  f; {( ]9 P" K  m3 y
        if(pshreRAM->packet_cout != count_copy)8 I/ R$ L) {" \2 I9 U6 C4 v
        {, V9 s7 B1 H( U+ R& g
                printf("a is %d\n", pshreRAM->a);  e3 F3 ?+ N4 O  N; K/ Z
                printf("b is %d\n", pshreRAM->b);6 g" i# b. A. z. C6 c6 m$ |
                printf("count is %d\n", pshreRAM->packet_cout);- b2 `) n6 L7 |
                count_copy = pshreRAM->packet_cout;, B' y" p' {+ f
        }% F% D  i, Q1 l$ l2 E0 ~
        else
2 {3 m6 D/ P% }: Y* n        {
/ T2 ^% T. R" X                printf("No effective message!\n");7 d7 Q2 q) U, C2 m+ e1 v+ w% @2 W/ w
        }
/ k- V) ]. G. f. ]" C( g}
9 A, G- D* v( T8 r5 b/ o2 P" T+ E/ }/ ?  ?7 V
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
0 Z9 g5 G" d: L
, n. n9 ~  I- f/ L
+ Y/ i2 w6 x6 n7 n  \. M/ l; @# Q( t8 }+ G
  G, V( n1 y1 ^) r
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-4-8 00:06 , Processed in 0.040483 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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