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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
( \  j' H" J2 g$ F' R  }! l  z
+ g- h) D* ]1 x0 M1 s4 ]OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>& \& s0 |; N$ L0 `
#include <unistd.h>6 {" c/ d1 |3 u) Z
#include <sys/mman.h>
( _' [* e; r! p9 k9 g. ^) M* z#include <sys/types.h>! R7 s7 c% w9 [
#include <fcntl.h>% g% v, W0 p3 U1 W& V

4 H9 ?; ?  c6 f; x  a#define SHAER_RAM_BASE_ADDR    (0x80000000)   5 H* F2 X4 x/ D1 S, v5 ]: i0 f0 v
- n+ K/ y  e2 m+ F. ?) ]
typedef struct& U7 O1 _: B4 o+ D
{
  ~  n+ E, ]/ E: J  \        unsigned int a;# L. P, a: s2 r1 E, t" C& Q' D
        unsigned int b;& P( j* @: r; ]; v
        unsigned int packet_cout;
, l* K& P7 b3 s; h0 p3 a; x& a9 W+ F}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;( V& e$ |7 h  @$ }2 t0 y

) |3 Q: U" a4 q, Uvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);: m) t7 S) Y( F5 {" ^+ j% I8 A  B" R
unsigned int count_copy = 0;
8 Q2 j1 s8 }  @& f  n: @/ m3 {! L/ \$ m# ~
$ S: K, A# b; n& m% S
int main()% N9 K+ \4 T' z; n  Y1 Z( N: Z
{
5 N, j- G9 h9 N        pRX_MSG_PROTOCOL pshreRAM = NULL;
- z- S: a9 \3 @& d+ Q5 H        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
5 T( ^& m! a6 ^. @) R; V6 |0 D/ C0 P
        while(1)# R/ l+ a* Z( d1 y: n
        {
' y% z+ o& n# ]7 t                read_MSG_buffer(pshreRAM);- i% P$ f/ o% [" m
        }                0 l' Y6 N6 r2 U9 U2 E
}
% H: D. l) i9 _9 Z' h# e% a! {
  u% }4 ^  n4 tvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
+ ~% |- T; l9 g6 }  W' H( \  k, y0 D{
. W$ j: a0 p9 D: |9 t; s4 s+ q        RX_MSG_PROTOCOL buf;9 L) a9 ^3 q9 G* _2 ^( g
        " E- v: Z) m7 f1 ^" y
        buf.a = pshreRAM->a;
" J: y2 f3 s; Y- Y6 x! S+ w        buf.b = pshreRAM->b;7 ^( p( a  v* }* k% K
        buf.packet_cout = pshreRAM->packet_cout;
% x. N! ^. p, `6 e' B. p, G        ! I. L6 P. S, E0 h7 L
        if(buf.packet_cout != count_copy)
& D" q: @. U$ V. t5 H8 o: k; i3 `        {
4 u( f7 c2 W0 ~" p                printf("a is %d\n", buf.a);
( a  V5 h. T. f: p3 z                printf("b is %d\n", buf.b);" w4 {4 Y6 ]1 o3 N3 S% t
                printf("count is %d\n", buf.packet_cout);* U9 l% w( ]8 _* Z- j2 m9 Y* U, u: M
                count_copy = buf.packet_cout;
- w7 [! ]6 n: }0 _5 e5 P4 e        }
' Y7 v1 S, Q& Q( \3 [8 H        else
# F2 C2 g6 N3 _( A& e9 i        {
5 o8 @- k" p; D6 H                printf("No effective message!");" n) i4 S" A6 g* c7 [$ L, [
        }
" V- \3 k- r6 [4 l}
& C% x) ?4 `4 ?6 S: S! ]$ K8 j
8 f6 ?% \! p! Z4 @( H' K+ j# R; l7 r8 c# f( k
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。; O) E: l' X% V/ o  N8 J) p' R
使用下面代码,对内存使用了mmap函数后:
2 B( _) V5 Z6 M9 P0 v+ w/ S#include <stdio.h>' I# `* A# ^  m
#include <unistd.h>- p% a' p/ y3 p5 C1 l7 W
#include <sys/mman.h>
% u1 ~9 t& A8 c- N! n+ I" d- q#include <sys/types.h>7 O8 `- R6 ?1 G+ B/ C
#include <fcntl.h>6 G! w' ^: m& e- b9 s
0 _; s% K. a$ i# C
#define SHAER_RAM_BASE_ADDR    (0x80000000)
3 a4 q: v$ l5 Q5 c4 @3 N#define SHAER_RAM_SIZE         (0x20000)   : t9 C0 l; ]$ F  M  f0 p3 }

) e6 v8 \) d/ w; a- r1 E! ltypedef struct
, v/ R/ b7 ~+ }+ }; ~. k2 F{
0 L2 c5 e3 ]% D5 m# V# q- |: p        unsigned int a;
# n3 @* @/ R7 A3 M4 }+ E' @        unsigned int b;9 H% S! v( l3 ~$ C
        unsigned int packet_cout;0 A& d9 H) ]' Y, d$ ^+ P1 l" I
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ R; W! \2 W6 n5 N
; Q3 e: h' A3 H8 h0 ]/ Ivoid read_MSG_buffer(int *baseaddr);4 ^" b- O# b/ b/ B3 V. W5 j, `
unsigned int count_copy = 0;
" P2 J/ }# B5 N  I* F
0 b+ X) o9 {: Jint main()
; f6 w4 u$ ]$ \0 {  u& {$ s{4 H: v2 s. K% q; `/ r/ U& N* \8 p" G
        int fd;1 a0 M( ], H  u; I; F; ~
        int *mem = NULL;4 a( ^/ Z* S; O
( ~  W' J5 o* p, R, ]
        if((fd = open("/dev/mem", O_RDWR)) <0)  y  f( |* o3 d% E) v0 z7 b
        {! l# {7 U) r# W; @4 h
                perror("open error");
; d. \& v, {' _5 m7 z3 _                return -1;
$ `* t1 b& U1 C, y6 @        }& t  ^6 U3 S) g, |
        
8 Y0 M* w6 W+ |  k        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);) B, I, [9 U8 T- Z! ^2 J; q

1 C$ S( I  m" y. b        while(1), T( p4 U6 B4 V1 x* D1 a, Q
        {
. }- ?" y, ]* t' j, `0 g                read_MSG_buffer(mem);
& [. B( b/ Q. ?' ^: n' z; Z& ]        }               
* a/ u1 l& d3 a8 L6 X) ^5 t& z}. ?2 E, L. F3 `
: w: Y4 n7 v, v9 n
void read_MSG_buffer(int *baseaddr)$ h; `8 q/ l- F0 g- s, U# L8 Q# A
{- u8 l! i& ^+ y( q
        pRX_MSG_PROTOCOL pshreRAM = NULL;/ L* m- y: o$ Q9 E1 }0 _2 v' ]3 E/ }

# S# O$ e0 s( u$ ~        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
3 q  A: S2 S: a- P# y1 S9 S- K% {! _: u  E5 m7 t* l
        if(pshreRAM->packet_cout != count_copy)
1 R+ C3 M0 m) b% K        {
4 T/ J4 a: M2 T* e+ C5 x                printf("a is %d\n", pshreRAM->a);5 a& }1 L) G4 s$ G7 ~7 T
                printf("b is %d\n", pshreRAM->b);
" v: \3 p+ M7 I6 f                printf("count is %d\n", pshreRAM->packet_cout);3 p7 a& y& k5 B! i2 ~5 G$ A
                count_copy = pshreRAM->packet_cout;
( ~3 C4 w) y0 e1 c! i5 D        }
: D8 c( a9 B( F9 ~* k5 B        else
& Y. B8 T" z2 C/ x3 W, p        {
9 C1 i) u2 ?. ~                printf("No effective message!\n");
7 o1 q" Q7 u" _- e. E6 s- n- i( ~* [5 o        }7 w. h5 \) h9 E( ^2 D
}
6 J/ @, l, |/ ]* w1 U5 Q# l
% \5 Q1 B' @5 k! o  |8 G没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
/ ^1 y) X# t+ t4 o) n3 |) l3 U  s) A# j7 S7 H
2 ~) F# x" E8 ?4 |8 F% V
+ Z2 \2 Z! R" f) k, ]. `/ r

2 c, R- L4 w. j
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-11 23:11 , Processed in 0.039132 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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