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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
7 |: U5 S7 Y+ G/ N% [, N
( a# f) f+ l: E4 s- f: X- D: I+ {OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>/ f' M7 Y0 }; n0 M; \
#include <unistd.h>
' O* L$ x+ p# q8 ~: i- ~# W#include <sys/mman.h>
8 [& h! D5 b" l! Q#include <sys/types.h>
) Z, o# Z7 E# H* t) H#include <fcntl.h>4 ^$ L; l+ a. c
  x! I3 s+ s( Q
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
1 L3 w, J) s# W# Z) A9 d' ?
1 b7 @8 G! `* qtypedef struct
" L: u( _! K" U{
; ?+ f1 u6 z& ]: K        unsigned int a;
+ P4 j2 M/ W" n2 f0 w$ w        unsigned int b;
' M7 g% ?" P4 G: N4 S        unsigned int packet_cout;% F( R8 C- ]6 m) l" {) @
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: e' P; G& }6 b) X% I& w
: r; W  W5 p4 Y5 @3 h  Y9 \: vvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
% b& H4 |" r, t5 V$ b4 a/ eunsigned int count_copy = 0;
4 K4 \1 t% W: |: [
, Y% |* N# J* F+ b- i- b' z  D, A0 f+ S, p0 B$ j9 \4 `
int main()5 m8 ?% A9 i; Z$ z
{# o# y6 s/ X- B0 Q+ W
        pRX_MSG_PROTOCOL pshreRAM = NULL;) |8 r9 i) D8 R6 F) r, f0 W
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;$ s8 e$ L; y1 @6 E
* U! L/ b$ u( {/ G* }: |1 P" j
        while(1)
8 K3 R" C/ c+ ]7 R/ T" P        {
$ o/ }6 l% w8 t+ f                read_MSG_buffer(pshreRAM);
* I( K& B9 r  W9 `0 U$ F- v        }               
: X- d) i) m- a* e7 J) Y}
; i2 ^% U. i6 }( N8 s
; e  D5 V+ f% ?void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
8 O8 I# r1 E+ m3 H{. ]+ m9 z0 m. a! O
        RX_MSG_PROTOCOL buf;
4 Q8 B1 Q# N* S2 J; t        
; z9 B1 M8 W  I, V; ~        buf.a = pshreRAM->a;. d- e% n- }0 P6 Z! v( f
        buf.b = pshreRAM->b;6 N3 ^6 [# i8 c6 c* B0 h9 L4 T
        buf.packet_cout = pshreRAM->packet_cout;
/ s1 F! b' ]  ]- N        * V2 O$ Z' E6 J' [+ k3 s: U
        if(buf.packet_cout != count_copy)4 [7 q  Q0 M( J" k% f
        {
: T% ^6 P+ }1 R8 ]* W                printf("a is %d\n", buf.a);
9 R+ ~8 \" k6 K1 H2 q                printf("b is %d\n", buf.b);% J7 [! u! E3 G  `! e" \* i
                printf("count is %d\n", buf.packet_cout);
$ ]4 W# V5 k% ]4 r' E& g  Y0 L                count_copy = buf.packet_cout;
( t2 D9 g! |& o% `6 {! O        }8 b; i  a8 n( ?
        else2 v* k5 f( M* \) f# k; _: i
        {
9 \6 S6 u# ^7 y3 K" P, Q                printf("No effective message!");. l+ W5 R$ J0 ]: T4 ~3 T' j
        }
( k0 B% |, E9 e. }}
+ J& d& D; @1 `$ x
1 ]; Z4 l* Y8 @* m7 N- l4 T! y( ~+ F* r' h9 h* g; o" C
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。& [- @" @! @7 Q3 R/ M# H
使用下面代码,对内存使用了mmap函数后:
" V: w6 y6 R' f1 P" ]) u: c#include <stdio.h>! p& l4 A7 i" k3 ~0 h
#include <unistd.h>
: h2 _5 `! z- F8 k7 V: a) {#include <sys/mman.h># V  w" O" F3 X' w, Y  {4 ^/ s5 w; D
#include <sys/types.h>2 x2 R* m% D9 D
#include <fcntl.h>
- I. H) S) m9 l8 N, @3 W. h! z
/ r+ t0 ], a3 x6 Y, G#define SHAER_RAM_BASE_ADDR    (0x80000000)/ s7 _. J+ i; L6 K# p) \/ @2 x" C7 c
#define SHAER_RAM_SIZE         (0x20000)   : }, K8 F; T# O* Y* y
; {& P: {" m/ k) A- m9 X- Y! {+ J& g# p
typedef struct' w+ z; V! s- s7 u0 j. @( ?- e
{
, _9 M6 e3 F+ H  H8 U2 j' d8 d: W, P        unsigned int a;; K3 I! @) D1 k
        unsigned int b;
2 w* s9 q3 b1 T5 s0 t        unsigned int packet_cout;
8 E# H6 a) c+ F* ?}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;* }  A" Y$ I* V8 _, \
* j, d8 v  D1 i4 X. H0 G
void read_MSG_buffer(int *baseaddr);! p0 I+ z$ v- E, i9 l: Z  ]. n
unsigned int count_copy = 0;! x2 V5 }2 B; ~
: ^9 a7 z* L5 B2 |4 q8 f8 V
int main()7 }7 `6 p. o% A8 a8 o1 R
{4 M' M) }' O( Z5 j1 p3 A
        int fd;8 L! R( b0 r3 a
        int *mem = NULL;
. n+ b3 p( F/ @/ f6 Y% \. H
. n  `9 a8 Y2 J( }/ b        if((fd = open("/dev/mem", O_RDWR)) <0)
4 s5 Y. x3 E$ d        {$ P$ y  e) U, C5 f" G* F
                perror("open error");
3 g% Y3 h8 J# ?. a$ I! g! Y                return -1;
8 \  T! q3 p2 N# K        }' z4 ^  n0 Y3 I4 ^5 b
        
) j& _+ Q; \7 i6 ~- x9 I4 i  O        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
% x* ^0 R2 ^1 U$ L. c& J9 c, b. o
0 s; N. n0 }) T        while(1)
3 O2 H' h! @/ r) {        {
, _1 T( Q* G5 `! B. U                read_MSG_buffer(mem);
: ^$ g2 w" o2 w) B+ O4 S+ r        }               
! V' b# s' P8 n* e7 }}
! M: Q( H" {# o) d) k2 H: j, W
0 T9 q. V9 i0 [6 Rvoid read_MSG_buffer(int *baseaddr)0 V" u/ f9 ]# [7 H
{
) Y  m3 x  a7 T        pRX_MSG_PROTOCOL pshreRAM = NULL;4 b7 w5 P' D& C! p; c
9 Q0 u/ `, V% Z1 x( u( |/ ?) U
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
5 W- [- Y: a4 X5 l# d: z8 T- ~4 J* C# P
        if(pshreRAM->packet_cout != count_copy)( p2 i* Q5 e0 ]+ j
        {5 N6 p, ?9 ^/ `4 d
                printf("a is %d\n", pshreRAM->a);
9 \/ }/ {. f( z, h; a                printf("b is %d\n", pshreRAM->b);
# e+ o0 \! `/ O1 ?4 D/ b                printf("count is %d\n", pshreRAM->packet_cout);
# I* B+ l2 I: k. a9 P                count_copy = pshreRAM->packet_cout;- ~' k! x4 ?/ f
        }
; |3 A  I1 s- e; _        else
4 U# X7 n% Y1 P7 ?" [, \1 d        {# \0 X! X5 @, h
                printf("No effective message!\n");
; e2 v. X# E* E% ~/ h        }0 [; E  T6 s: k! l9 |; F
}
! ]* L! q% V0 {3 Z: t( Y4 ]' }0 Y% I7 H! q* B0 O* t; R# C; g
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
! [8 e' C1 G/ T! ?* f8 q2 _5 S- T; ?# i# G0 g4 U0 m
$ {0 b& q+ l7 c: f$ u
: c' F# \$ x/ z" i6 _* v, m
  J0 k; @: F. ]0 i& k
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-28 05:58 , Processed in 0.042181 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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