OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 8 q* G) G: ]9 q3 G  @) l
) I7 c! ~5 Y/ Q9 m0 q* r2 Q
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
; E4 A+ W& h* u3 r2 L& `#include <unistd.h>( ~2 y  E2 g5 e$ [- g% |0 c3 Z
#include <sys/mman.h>2 W" G5 k: H3 o% R* u, Q
#include <sys/types.h>7 V* M; \- Y; c; I, i  j0 S
#include <fcntl.h>8 ]. _1 F2 u3 Z/ N5 F/ o  @! E

' }/ e3 j, k4 Y#define SHAER_RAM_BASE_ADDR    (0x80000000)   3 @0 V. ^2 C3 S8 F" T1 \9 E
$ U2 a7 W/ N5 {
typedef struct
5 U: k8 o9 I" U6 Z( n$ h& m* f. ?$ g* P- w{
8 H  \+ k- V( n- q+ n. D) x" f        unsigned int a;3 H# [) n# @9 B  a6 h0 L: ^) H  S
        unsigned int b;' i- K1 a" |$ V; U7 I4 T
        unsigned int packet_cout;1 ^  L2 i+ g  P
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 ?' K2 I: Z( Y- r# f/ R* S; E0 F; K: _
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
# S+ S& r2 I* p5 @unsigned int count_copy = 0;' E9 g( Y7 T, u% f

, H4 r, M% d$ ], r: R
; ^6 y0 z7 r5 M) f- f" R, rint main()5 W% U! F; j5 h! W2 @2 A
{6 G" ^* k; `/ p0 y% \- T' _1 p5 A
        pRX_MSG_PROTOCOL pshreRAM = NULL;- O. u, d1 x* A' P* e3 h
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
4 E9 I1 P# @9 c9 W- D6 g1 b  t6 b9 V( |; h! ?( Z$ h) u2 u& _
        while(1)3 d0 @+ }$ R: n0 T4 M( _
        {
. X+ c$ _1 r: |                read_MSG_buffer(pshreRAM);
/ \$ o. Z8 @( B) _; @+ x        }               
, t; C& I% L, p2 w! I( ]}
# i, U! W8 {" j: ]' l" k: n: O7 N8 {
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)% h) `  y% D8 [* \
{
' O7 a  Y' w; s# J5 m4 ^        RX_MSG_PROTOCOL buf;8 T$ |! h. s6 k: x6 {5 {: t+ @
        
' G5 i0 ^+ v3 [        buf.a = pshreRAM->a;
/ ]. o  B! ]- w. n        buf.b = pshreRAM->b;
) R) j$ ?) x6 T; j        buf.packet_cout = pshreRAM->packet_cout;& {8 V+ W0 ?0 M) F9 g
        
3 H$ k1 @/ X8 Z! G6 q/ f  b        if(buf.packet_cout != count_copy)
: @8 q: A4 W! F7 k        {
  p2 t9 G" [7 f+ I4 C- r6 J' w' Y                printf("a is %d\n", buf.a);6 e2 u' J! \1 M3 `. Z" ^, |; M5 f
                printf("b is %d\n", buf.b);
% B6 H8 Y( y  |8 G/ q4 @                printf("count is %d\n", buf.packet_cout);
. g2 l3 o5 N4 w8 i+ z5 [                count_copy = buf.packet_cout;
* N' U6 S- ]4 k/ T, ?2 V6 ?/ x        }
% Y: o) T, c6 p! ^) \: X6 C; {1 z        else
0 }+ w& Q  G# b9 l        {
; t5 W, w1 {- i( o' g$ I                printf("No effective message!");. t1 x% F6 R* U! U! S: V
        }
9 A+ a' ?. I" m- F# [}' M+ s" O& @. L! e1 J

$ ]; x* D6 v- W* {
9 A/ g3 n. Q3 f* S+ n但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
7 W( W& d$ j# d7 [- M! M9 ^& ~使用下面代码,对内存使用了mmap函数后:/ a2 w' m/ i: n
#include <stdio.h>8 s. h' P( X; O# w. r! j2 J
#include <unistd.h>
4 K5 h9 m3 L2 {- T$ D#include <sys/mman.h>& i2 v4 S: n7 n- y  D6 R
#include <sys/types.h>
9 u' W, m8 J: t: R% Z#include <fcntl.h>
" b5 ?7 T" }  `" \" ^6 p& I7 T0 O9 E( o0 I
#define SHAER_RAM_BASE_ADDR    (0x80000000)% H3 P+ t* t4 ^/ `: R+ f$ N  ]; q
#define SHAER_RAM_SIZE         (0x20000)   
( A, s* K% h4 y% l# O- |
, {8 B5 ^+ s; f1 ~typedef struct# l: c, R% F+ A. a# m
{% ^( K* P; Y$ s7 ?
        unsigned int a;  |; _* W2 U7 q0 Q3 ~% E
        unsigned int b;9 s: F, }( N3 J* Q& e
        unsigned int packet_cout;' I. h, e1 ]' p3 n
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;- K! {% Z. E/ ]8 [" B+ w0 v
+ L, B/ {& l6 _- |/ \2 ]
void read_MSG_buffer(int *baseaddr);
& m' X" F8 z8 R# `unsigned int count_copy = 0;
; I6 _3 `2 S( j8 u5 ?0 d
6 E# l1 I3 f9 Cint main()- a/ V1 Y; {# w0 a+ X6 Q- I- V- x
{
" A# E; r, N$ T0 e/ ?5 S8 Q  x        int fd;
4 n" G; C6 j0 ?9 L: m7 X        int *mem = NULL;
4 A! W8 C/ }# U2 \! F
% s! Z8 T7 V+ M9 x6 p        if((fd = open("/dev/mem", O_RDWR)) <0): k& A, P6 b$ N
        {0 e  `7 P7 y& B
                perror("open error");2 z9 ^! G- E- v' I1 p6 V( }% P4 G
                return -1;
! k* L9 T3 P/ O3 Y: U! P$ u        }
3 u. p0 D* h) K        
3 Y) F, m# ]5 P9 f        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);4 e, u1 p0 o4 j- I3 \# }
4 Z8 {; u( a5 a3 |
        while(1)
# T9 p$ C' V; x        {1 a- N) O+ B6 k  U4 Z
                read_MSG_buffer(mem);
4 K1 d' H/ ~) E) E        }                8 {* O: z( O1 M" c0 Y
}
# C. l' _/ i/ ?; |  @
# D4 W: g7 M7 g, G6 u/ `void read_MSG_buffer(int *baseaddr). O0 M0 F* l4 f9 n& W
{$ F0 R" A* O% E, j5 y1 d
        pRX_MSG_PROTOCOL pshreRAM = NULL;" o% l. ?2 e5 F( e( V$ a
/ v! W2 L6 |5 t: v5 y5 @6 A3 y( K, K
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;% _* V9 o& S6 \2 ]6 ]

" A! n) u8 S- V( T1 X        if(pshreRAM->packet_cout != count_copy)
$ ~7 v2 ^! A; D  u" o        {
. S+ j( g3 T0 p" e, g6 }. a7 t                printf("a is %d\n", pshreRAM->a);
8 F" T% O0 S; _9 t, y0 I: X0 [                printf("b is %d\n", pshreRAM->b);
6 l7 g# G! R2 E. n* C) y% H                printf("count is %d\n", pshreRAM->packet_cout);
6 _4 d+ |) S% U, O4 X3 V                count_copy = pshreRAM->packet_cout;
( x* d/ d  x) G4 ~+ E% R        }- l' S4 g8 I" D: i
        else
  Z7 L) P' |0 A! ]6 t        {
% E/ \/ ?, @2 g9 V, d2 i/ L                printf("No effective message!\n");" _2 v% u, m! j  ]
        }0 M- U; S9 O& W# n/ R% B
}$ g: _$ R; `% t& J, X  p7 N
, b, M' S0 X# q! Y/ Z
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???1 a* {0 v* k7 k& N! F. t2 T

' t, I0 `9 }# c" `' t3 K7 \9 b) W, J! A5 v9 H" X% M7 a
" b# \$ K5 ~7 Z5 r

" D) h7 v/ F2 J; B  s# q7 l) }4 [2 l; V
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-27 20:19 , Processed in 0.038523 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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