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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
' |3 G% D' n" v0 E% g$ q* `, a& n4 {+ v6 y
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>% F6 O9 m% M- J/ T
#include <unistd.h>
7 u% Q$ |5 E- b: y$ v#include <sys/mman.h>: p: \# b- q2 y" e2 r( A* n$ [
#include <sys/types.h>; j& R2 g6 V) z3 E, M' M
#include <fcntl.h>' N0 A! v) H( }# w9 c' i/ N
6 O  E: m) A8 n* V
#define SHAER_RAM_BASE_ADDR    (0x80000000)   & P$ R) i  C- B. Z+ L+ F8 `1 S6 J  Y
  p  V5 |" l0 C% N3 j. ^) n) ~7 ^& q
typedef struct! A( p: W: B: h) D6 k: A
{( e( i' U/ t# b+ I2 Y
        unsigned int a;2 V( C, v6 G% s* p
        unsigned int b;
# U' h* S! r# j: e, m0 m6 E        unsigned int packet_cout;
& W. N# z) E5 s" ?2 c# F0 ^3 g4 ]}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. `: p7 y% w& i, {$ `5 w+ J0 f' j
0 U% o6 s) ^: l
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);4 m2 C* l! b% M; q, o4 O: g
unsigned int count_copy = 0;0 ^% \5 D9 n% _4 A% x" r/ t1 ?1 S

# `5 ^% J7 J9 r& D1 v$ p) T5 T3 g0 u$ Q4 @# T. M
int main()( b2 G0 u0 @% i
{( K; U/ H" q0 Q1 [
        pRX_MSG_PROTOCOL pshreRAM = NULL;; P: y4 T/ I6 Y$ g: Q! ?
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;8 a/ M6 a7 Q- `- h
/ u" i3 l. L. B8 `' @2 A# u- @
        while(1): I. U; l4 p3 A  t" I
        {
" E0 p. e" C; I                read_MSG_buffer(pshreRAM);- ]6 {8 n2 ?$ g/ j
        }               
7 Y* M) {  N- X% m; ]}
2 F! b9 i& o2 G) p! f
4 u5 t. n, c' D8 Evoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)" ^+ _$ R1 K" i& o. W, w3 N& s
{
1 C* _/ S2 @. |        RX_MSG_PROTOCOL buf;# `% f. S8 u7 n7 F+ C( s% P
        
7 |3 \- M- c8 Y( U4 a        buf.a = pshreRAM->a;
, K: A! ?/ l1 ^+ s' j- a/ z        buf.b = pshreRAM->b;# L7 `) u& R7 c$ [
        buf.packet_cout = pshreRAM->packet_cout;
" y0 H6 V9 ], C- a: _4 Q        
* x; d7 q5 G8 S9 n        if(buf.packet_cout != count_copy)
% @+ @$ k/ [. V) f: u6 q$ q        {
: Q* x0 u/ a( l0 [4 G4 J7 W                printf("a is %d\n", buf.a);* b4 T3 v% \5 d# b# W
                printf("b is %d\n", buf.b);0 S/ G; S9 `( ^
                printf("count is %d\n", buf.packet_cout);
0 T  f" j  T. Q3 K. @3 h+ i                count_copy = buf.packet_cout;
- {7 d! o& W3 A        }2 e7 H- k& ^* k, N1 W1 }# A- W
        else
* {, W2 r9 Z8 B0 E% d        {& Y' T! S( k+ }' R
                printf("No effective message!");* M, I" X0 u+ O
        }9 t- x2 s  C' D0 f1 |  V$ s3 b
}
) Y5 ]. y$ ~, j) i8 ^+ _' K
' O" Q8 j4 ]7 U; ^# b
0 ^9 H0 c0 ~2 D( U/ L4 N但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。, n0 n5 v. @# A& ^0 M' N+ |
使用下面代码,对内存使用了mmap函数后:3 F" Y# O: M9 v) L/ @- T
#include <stdio.h>
  B: `' G0 ~; a0 e5 D3 T9 h#include <unistd.h>; u! V5 E1 K$ s6 h" ]& S
#include <sys/mman.h>
# K9 z. ^+ C! Q#include <sys/types.h>
0 o  x; d$ P$ v5 j2 D7 M- p: p#include <fcntl.h>; r' I, Y, q. |: T% l
) _8 P" F% t( I9 D* X1 \
#define SHAER_RAM_BASE_ADDR    (0x80000000)7 K; T/ P" n  }+ R. j. w
#define SHAER_RAM_SIZE         (0x20000)   % E' _" l+ T& D% H
3 L) U4 |" J2 P* L* P
typedef struct
5 V  q9 J0 ~1 d4 [1 b9 p. A{: t- A; A; H- r# x
        unsigned int a;3 K/ Y1 ^' h+ @% J2 y. O
        unsigned int b;* v: V2 v, K& u8 I# H8 H# K
        unsigned int packet_cout;
  M/ a  b4 N# Y$ C/ G}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) E' X/ d, j3 L! L+ z3 P; F+ @$ q

& P2 g$ B5 Z0 K/ Jvoid read_MSG_buffer(int *baseaddr);, H2 |9 ~$ D; `" ?% |+ C+ U; b
unsigned int count_copy = 0;
" X3 p6 ~9 x* H6 z
( {( ?7 d, T& m. eint main()
5 v9 m2 Z, g$ A5 \{
& T2 ^# f7 ~* i  j8 N% V$ V        int fd;0 h" {0 q- ?( a* @; }  W0 ~/ q
        int *mem = NULL;
1 L  |& D7 u) \7 a& Y. m& H$ b9 t$ e# {. H8 O4 }
        if((fd = open("/dev/mem", O_RDWR)) <0)1 x8 e# P  V: X8 ~9 h
        {: P0 I: z  ?6 T! \$ ~/ \; S  L
                perror("open error");
2 ?) Y  c; U3 L$ m2 Z8 M0 Z                return -1;
: F. e3 w& }2 G4 x# P! c4 |/ j! T        }- r1 X$ K) A# Q: ^9 q
        
9 j8 ~3 I# b* E' m& o0 R        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
5 z2 p9 k8 F& f7 r$ N! b* f0 G; Y4 o! D; S7 h8 X
        while(1)' v. C) }; @- c9 C, ]- k
        {6 `' {  y: a* n: e7 m% O. v
                read_MSG_buffer(mem);
! ]  u( _' V1 b& h; R5 X# L        }                " q  \$ g, c7 t0 W" T0 j; M
}( d( @3 }/ V# b2 l* y: J

6 n0 M9 {3 E4 W& \void read_MSG_buffer(int *baseaddr)
* I8 `+ s- F) u( D{
9 P0 T" ?1 h. _: R% u. g+ v        pRX_MSG_PROTOCOL pshreRAM = NULL;
+ H& C! R' N" ~0 D( y/ a+ M& D3 n1 `# E2 f1 k
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
  e, _& \. S4 a7 W3 O
* E* T! @- M. j- B6 P% O        if(pshreRAM->packet_cout != count_copy)9 p. _' E/ k6 V8 A# \) H6 g7 u
        {) F6 ^8 t- x) A0 n' c4 i
                printf("a is %d\n", pshreRAM->a);
8 [4 i3 o: y3 F! s! Z- t4 n9 R                printf("b is %d\n", pshreRAM->b);
6 i  |: ^3 A3 B; J" L; B: @, v                printf("count is %d\n", pshreRAM->packet_cout);$ ~6 n+ o* p& m3 d+ K$ y: @4 S" _
                count_copy = pshreRAM->packet_cout;
' `" W, ?4 y) F4 r        }5 c. q! U1 @% S* V) Z4 A- y' ?
        else
5 X0 o) v( p. M5 \% A        {
; [! G. `6 i& x+ q# S; G3 @3 r                printf("No effective message!\n");
$ n" F. ?3 R5 \/ p. p" ]$ |6 o7 U        }
; q7 r# `- V7 J/ _/ \}
. G% u0 F5 b( d, H+ b& r/ n  Y) g8 q2 t: L0 r  z% H+ X
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???: w. J6 B1 N: V+ H9 [; [7 O

$ g9 e8 O2 A8 i7 t7 ]( k0 _$ o1 n& t$ W; ^# a

5 T8 I# ~8 z  t
3 r+ k! b/ o* l) a! O2 e9 W
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-21 09:54 , Processed in 0.040384 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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