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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
7 y8 L3 \1 W9 O) b4 H
7 }1 _4 p. X9 Q( C7 ^OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
: R, Z! ~$ d8 p+ u$ G# w% i/ g- ^#include <unistd.h>0 f! {7 S& C$ |+ }" U2 D
#include <sys/mman.h>) }9 K, M7 ?4 T3 F+ V
#include <sys/types.h>8 ^" t* f3 S7 H+ ^/ G) f, D/ U$ y2 \
#include <fcntl.h>
0 d+ Z/ v' P- h7 W& H& \
% Q) B8 v( R1 i' {0 ~4 ~4 C# o/ Z2 l#define SHAER_RAM_BASE_ADDR    (0x80000000)   
* L# u; Y) x' [. k( k2 S- N
8 u; n4 N  `+ qtypedef struct
. j  o  Z+ c) I& E# q& f{8 m2 b$ h8 m# I! \. M, i/ u, W
        unsigned int a;) m& F, O+ g: T: a! P
        unsigned int b;9 ^; c& C7 C, {) q7 C7 U/ n2 b* \1 g
        unsigned int packet_cout;
0 c: P% ^& p6 B, A( G}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 ^3 v2 e! u4 J& {4 }) H* m0 S7 M7 g2 p9 g' O* d4 O" E
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
  ^' z, M" ^. Xunsigned int count_copy = 0;
0 n$ m3 o3 S% _9 U% r- r
0 x. U8 u3 S+ j0 c! p& r* Y$ B
& g, s& H3 W% ?3 d! ?int main(); d. h: B/ J1 n* C) h: \3 H
{
! m  K* p3 `4 K: g9 p2 h) ?* O        pRX_MSG_PROTOCOL pshreRAM = NULL;
8 B9 Z1 _) j% l% _  m6 d/ r% x, m        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
1 x, g3 ]) v' F* o
6 P9 G5 v; O' d* L! D        while(1)
5 c) B! }- f; ?# ?        {
- G- P2 f4 Z" @. {5 b4 S( ~                read_MSG_buffer(pshreRAM);
- {' n, _$ H# G1 Y$ V& r1 w3 g        }               
2 Z: h5 w5 P1 s8 g2 [}
8 f8 T& D/ P8 e7 T' u: m1 g9 A( h0 t" I1 s/ w0 W
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)' g: Z6 {2 B9 t3 g! H' l# ?
{
& z2 B' C! Q' R        RX_MSG_PROTOCOL buf;
" _& _. j8 v7 N$ a# G: |        
% ^+ m" J; |$ c1 G5 i! u! @        buf.a = pshreRAM->a;- \! H& q" ?1 J# c/ i/ Y' z
        buf.b = pshreRAM->b;4 S2 I- J. m3 z
        buf.packet_cout = pshreRAM->packet_cout;
& }( ?" ~: L# d2 _% o. I8 V, `$ m4 x+ C        
- \3 T" A' N* J0 m* L% b1 F        if(buf.packet_cout != count_copy)
2 q5 Y& L# I1 v( W        {8 [9 R% _) C1 T
                printf("a is %d\n", buf.a);
! K; C5 r8 G( V( {                printf("b is %d\n", buf.b);7 i8 p0 z7 M" x# O8 O) O
                printf("count is %d\n", buf.packet_cout);1 Q: c) @5 D7 e# J) n) p4 Y
                count_copy = buf.packet_cout;
+ c- n. l5 t' Y$ j2 e* l& ^        }3 ~* {; }+ m+ e" L! `
        else6 t5 T5 N6 U' d
        {) y* k0 |) Z2 ?. X
                printf("No effective message!");
$ J% Q7 B) A/ N( p, E2 ?, V* k, f7 X        }! n* ^4 L1 h. z6 N
}% P5 q" }) [7 [4 f. Q$ j
9 a) w8 N, x9 Y9 e* a

$ f3 A' s2 c  d: b5 Y! }: k  z但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。0 G( k) Q' A- q/ J( F- P0 T# Q
使用下面代码,对内存使用了mmap函数后:2 P" t9 E5 m) d$ `
#include <stdio.h>
) j3 p; Q' g- i- U& u" [8 m#include <unistd.h>( R" E! E1 g6 t, ]5 G1 x/ I
#include <sys/mman.h>+ U: \3 a: U6 t, O5 j. q
#include <sys/types.h>& `9 @8 C; m+ f$ h
#include <fcntl.h>) W, I6 x7 T  o: t4 i' G" c2 [
/ t) H7 U! U- v1 ~: z' T& u0 K
#define SHAER_RAM_BASE_ADDR    (0x80000000)" K3 [9 }$ M& e) j
#define SHAER_RAM_SIZE         (0x20000)   
( s- Y% p& c7 n+ s
9 G* A6 g* o/ I  o+ S1 t0 }+ [typedef struct/ |, G" R% q5 p3 i0 p, _, M+ T$ R$ S
{
; Y# B% Z7 m% E8 _" X# l        unsigned int a;& l; @: p; \' }+ d" `2 p
        unsigned int b;, J$ F3 u! r# Z- T8 p
        unsigned int packet_cout;; i3 h7 H' e4 z0 q/ s* \
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;' z* M6 o7 B6 Y1 h. v

% i9 F' ]. n/ n& `# `( D* t; Mvoid read_MSG_buffer(int *baseaddr);
9 ~" v7 Z" a* d* N% Q( ?unsigned int count_copy = 0;# T9 Z& K+ ~. M
* o  U8 z- A- q" e+ Q# ]* w
int main(): [9 M9 G* z: m$ g! G
{
$ R& `- O: [' B, J        int fd;
1 h- a* D. E' R        int *mem = NULL;
) Q. E- M% M6 K* j! V8 |. Q3 O# f) {, r8 `2 q
        if((fd = open("/dev/mem", O_RDWR)) <0)
( _  L# S2 Y  V) T4 ^  ^7 ?        {
; \8 S/ `1 N; P4 M5 y                perror("open error");
, d1 I5 c; L7 Z; D                return -1;, B& T7 w1 B: g: r
        }
2 o$ P, i# \7 i% h- I0 m4 w        
4 |8 M1 u* n4 {( H( V4 k# E0 F        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);; S$ P) C0 F, @4 v

9 R5 V. E+ }7 q        while(1)! t+ ?" D9 b5 K' M# L3 h
        {
1 U, ]4 ~5 w' V- G- h                read_MSG_buffer(mem);
8 w$ J/ t' V8 R- p# C        }               
! j% A( ]0 r# ?}8 Y2 h$ c/ e& h
8 F  J) L" M. `/ H% X
void read_MSG_buffer(int *baseaddr)
: l  V/ H+ p  b! A{
" Y2 R+ v; d. r9 H% g9 Z! c0 t: I        pRX_MSG_PROTOCOL pshreRAM = NULL;
+ E8 I1 Z: R" a9 O- M- C: a  U5 @# H* A/ ~# d# u! |* q
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;( l( o- T" x' n9 |, p

9 g1 f, x2 v# E# G/ w# X  v! s2 H        if(pshreRAM->packet_cout != count_copy)
4 n" Y$ T& e/ z) G3 Z) z        {
9 k' R% q  P( G9 z; A                printf("a is %d\n", pshreRAM->a);
. h+ g0 Q) Q6 r) \                printf("b is %d\n", pshreRAM->b);
1 \8 d" F: h" x% |# J& ~4 X                printf("count is %d\n", pshreRAM->packet_cout);
8 d4 x  ~% K# x, J' n0 T* H                count_copy = pshreRAM->packet_cout;
9 `% l7 y6 N; o& c: E& N        }# o8 c% i7 W, r# \5 C9 j
        else
/ H  ^; g" @0 I" Z9 k* u- ]        {
9 z' f8 r, X# r1 p* `5 b3 Z                printf("No effective message!\n");& N, _( ]' m, R8 E/ q$ k, Y
        }* }4 F0 E, K4 ~+ R$ W5 n
}- y! n* X! S2 e+ Y/ Z# O2 d/ G- I

0 T+ j, @( O5 [3 L没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
7 Q; E# R5 y+ k. Y8 [3 X) P& w, K4 C) M9 [4 n+ ?+ O% W# @: V

0 R0 @# M$ }. X2 s* C" y/ E
* N5 z8 Y! a4 `5 T7 |" I( u. V' x# @. T' p0 z
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-4 19:56 , Processed in 0.040137 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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