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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
  {' a; ~- Z% w7 K- z7 v
& J  r% b8 m: F  pOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>1 v3 X. y# J! h1 c0 c/ k( W
#include <unistd.h>
# C3 ^5 A7 j8 v+ O7 F#include <sys/mman.h>3 P7 r  {, @9 u" o; _1 l! t
#include <sys/types.h>8 r! u' C5 }. [9 d
#include <fcntl.h>+ R1 h/ l) O5 e+ j$ w

9 x* U3 y) j  u, }% x0 C6 h#define SHAER_RAM_BASE_ADDR    (0x80000000)   7 F% W, b9 Q7 D6 ^/ @2 b
8 x+ v- B3 v/ V5 j6 c) v
typedef struct
2 X2 q5 z) C" T{
# v$ h9 M) Z' h6 J, c! s        unsigned int a;. b) A  V" N4 r$ I$ h9 Y8 b
        unsigned int b;
9 t% @$ f  h# w9 l9 k        unsigned int packet_cout;, B, r8 p8 z- ?% t. t- R
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 j3 w, n' h* A: J* M, S  g: {; E  @- N
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);/ ?. o* N2 ^! E
unsigned int count_copy = 0;
: s* }- W7 d" p% \5 {1 ]& m' J6 {/ r# R0 U& r  N8 [
; w: h* |. l' V2 f' y
int main()/ |' y& [# }4 V  ]4 N2 W
{6 x% \( M! p8 p
        pRX_MSG_PROTOCOL pshreRAM = NULL;9 k7 F  G/ w/ `8 O- l
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
. A8 T! [2 N0 C2 I) k7 H6 W9 W# M8 n- V* P! @/ l0 L$ r0 a
        while(1)
4 a, z. K- }' F5 \        {
  A1 Z& [* ]& Z; k! a5 ?                read_MSG_buffer(pshreRAM);% N) m3 t' g0 q& k9 j
        }                1 ~2 ]# ?" O0 D+ w* d0 s
}3 I7 u' f9 f+ B+ t: [& y3 }
% }5 F# p) y/ h" p" w
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
% e. E0 G! R+ \& `. U/ Y/ k% L{
  A( [3 K2 i; Y0 Y        RX_MSG_PROTOCOL buf;6 X, O6 Y0 U' z0 b+ G) X. N& x2 J
        
8 T3 K( B7 N+ \( V        buf.a = pshreRAM->a;% l: P- n$ A+ |8 K! D, {: [& |
        buf.b = pshreRAM->b;
& q5 A$ p7 W! Y& O1 }- \        buf.packet_cout = pshreRAM->packet_cout;
3 F! A' }' G. U' g% ^& ~! B" r        3 X3 R7 K$ R1 C. T% G2 Z, K
        if(buf.packet_cout != count_copy)
; f6 S; S/ Q6 D+ B7 q0 }! j        {0 \+ T* U9 {  D* n3 @2 i
                printf("a is %d\n", buf.a);, i) T3 z; M* y1 X) @* E" V
                printf("b is %d\n", buf.b);, g# u; \+ l0 x/ N$ O  w. ^
                printf("count is %d\n", buf.packet_cout);
7 f& \: F4 j. E: L                count_copy = buf.packet_cout;9 L7 z4 f6 N8 Z  E
        }8 p1 O, o# L# D
        else
) S  [# b8 ?5 l9 }* b- z9 c; l! o        {& M0 ^; k: i2 E$ j! S2 R7 H
                printf("No effective message!");2 e. w; g8 C3 ?4 h
        }
5 m# H+ w+ F5 M4 y' {& B}$ a9 u6 l% q$ q% S
9 [0 J8 W# ]8 ~. {6 S* w
9 s+ Q  N, T. @) x# E: B3 x" R
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
( u" b$ R8 M3 h6 L# n' C使用下面代码,对内存使用了mmap函数后:! E) j" d* a' A% W9 z1 V: d
#include <stdio.h>% i+ h5 I8 u% F( F& y/ b5 H* U7 p$ y
#include <unistd.h>. i8 i. L% }0 r$ B; v  G
#include <sys/mman.h>- o6 q+ j/ [* k, F1 {) R( S& z
#include <sys/types.h>
: \2 M6 z3 J' K0 }1 @#include <fcntl.h>
( V  k: {. y3 w* A; G. s: {+ j7 q; \& L4 r7 b
#define SHAER_RAM_BASE_ADDR    (0x80000000)
( [3 \" {2 b8 x- Z/ o! I/ b8 K#define SHAER_RAM_SIZE         (0x20000)   
, W0 m; ^6 W3 A+ |& g) I
3 w7 ]9 L* E+ A' Vtypedef struct2 ?4 b: `9 k) G* m# v+ r( O
{& y3 C$ e1 p& f' O5 R
        unsigned int a;
/ @6 P9 {2 d6 r) [6 p2 A6 d1 w8 W* [        unsigned int b;1 }- C: y7 M' M% k$ |
        unsigned int packet_cout;2 ~2 q* Z( c5 c1 F
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 R4 A7 i( G' U9 w4 ]. p
" t* a5 P8 O9 Avoid read_MSG_buffer(int *baseaddr);
% c2 v' ^& `0 tunsigned int count_copy = 0;% X+ f/ c1 N4 k. m1 x: p+ G+ W
- _% D# N, @1 h
int main(), J" `* ?* d4 a* E9 T
{( t4 Y: _% l) Y: S! p- p+ i
        int fd;8 l( ^8 [9 I, H& o$ _
        int *mem = NULL;
$ D5 N( l- G) R: q4 U
& W0 c7 M! Q& L. I+ F1 ?# z        if((fd = open("/dev/mem", O_RDWR)) <0)
8 u! ]* E  N7 i' ~9 u        {
( H; G/ J& O# V9 H. D4 A                perror("open error");
& N/ y3 a# D' y  {  Y                return -1;( k9 q' z% _7 C- Q) b
        }6 k5 u8 Q! I  w6 i$ C1 k  c
        
. N5 p0 S, `- |1 d' n1 I- \3 r/ t+ t        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
* [+ _1 n7 G& x! j- v0 G+ m* y) }
- w9 ^0 ^+ E9 P* Y6 E& e        while(1)
& j* {4 u) G2 M+ _        {
" {- E! O: S! J                read_MSG_buffer(mem);' n3 W" V# ~1 g# q
        }                / e) q5 j4 X0 T% Y: J- X+ e
}% ^8 c# h! |, [/ |& R3 {
! l& [) v) B  v9 |3 V) A
void read_MSG_buffer(int *baseaddr)2 r  H4 {7 G. H9 [" |
{
7 l4 q3 g. ]! L0 `0 `: h3 G        pRX_MSG_PROTOCOL pshreRAM = NULL;( w& Y5 G" E0 M1 D5 n
" `8 n  i0 [; f- r5 l7 W, ~2 @8 ?
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;: Y6 C8 ^" Y; x# n" o

" O! a) \8 r9 Y5 l+ a# i        if(pshreRAM->packet_cout != count_copy)
; ~7 ~2 m+ k* b- k8 o, d0 r        {
* K- p5 s& F1 y) ^7 q+ |; j% B                printf("a is %d\n", pshreRAM->a);$ o+ j/ d2 v' g7 S+ q- j" Z
                printf("b is %d\n", pshreRAM->b);5 B! I. H+ s, F- C7 e
                printf("count is %d\n", pshreRAM->packet_cout);& Z0 b% L8 W8 q
                count_copy = pshreRAM->packet_cout;) H2 u/ C! t. x: i' I1 Y0 \
        }
+ g; p4 t- O% x6 P        else
' f( q; u) c2 @2 W7 r        {  U7 x6 \/ P; M7 N. O5 @
                printf("No effective message!\n");% O- ]$ O! a% |; N/ d
        }7 E2 V' ^, _9 t- |3 J
}
; ^5 l  e  z7 i- ~6 r6 l1 Q
  v+ j" u6 O8 C6 L/ y没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
& w0 _. `# L3 O3 d( n6 X" Z0 t8 o2 V/ i+ [$ |
( P9 N+ }) P" O' V' c/ [6 ]0 R
+ n: f& Y1 j! ^; z2 c( s0 c' R2 X8 ?
9 ?2 i  N' p  m* N! R4 p8 B
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-24 01:18 , Processed in 0.044898 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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